<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

java注解詳情及自定義注解和使用場景

注解概念

注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。

jdk預定義的注解

@Override:檢查被該注解標注的方式是否是繼承自父類【接口】
@Deprecated: 該注解表示注釋的內容過時
@SuppressWarnings: 壓制警告

jdk提供了4個元注解

JDK中給我們提供的4個元注解

1.@Target:描述當前注解能夠作用的位置

ElementType.TYPE:可以作用在類上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成員變量上

2.@Retention: 描述注解被保留到的階段

SOURCE < CLASS < RUNTIME
SOURCE:表示當前注解只在代碼階段有效
CLASS:表示該注解會被保留到字節碼階段
RUNTIME:表示該注解會被保留到運行階段 JVM
自定義的注解:RetentionPolicy.RUNTIME

3.@Documented:描述注解是否被抽取到JavaDoc api中

4.@inherited:描述注解是否可以被子類繼承

自定義注解

注解的樣式

// 元注解
public @interface 注解名稱{
// 屬性列表
}

注解的本質

在對該注解類的class文件進行反編譯時,發現注解的本質是接口,并繼承java.lang.annotation.Annotation
在這里插入圖片描述

自定義注解

了解本質后,我們來進行自定義注解的講解

自定義注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InvokAnno {
String className();
String methodName();
}

定義studnet1類

public class Student1 {
public void show(){
System.out.println(“student1 show …”);
}
}

測試

@InvokAnno(className = “com.gupao.edu.anno2.Student2”,methodName = “show”)
public class MyMain {
public static void main(String[] args) throws Exception {
// 獲取類對象
Class clazz = MyMain.class;
// 獲取類對象中的注解
InvokAnno an = clazz.getAnnotation(InvokAnno.class);
/**

  • 注解本質是 接口 獲取到的其實是接口的實現
  • public class MyInvokAnno implements InvokAnno{
  • String className(){
  • return “com.gupao.edu.anno2.Student1”;
  • }
  • String methodName(){
  • return “show”;
  • }
  • }
    */
    // 獲取注解中對應的屬性
    String className = an.className();
    String methodName = an.methodName();
    System.out.println(className);
    System.out.println(methodName);

// 通過反射的方式實現接口的功能
Class<?> aClass = Class.forName(className);
Method show = aClass.getDeclaredMethod(“show”);
// 方法的執行
Object o = aClass.newInstance();
show.invoke(o); // 執行對應的方法
}
}

注解應用場景

場景一:自定義注解+攔截器 實現登錄校驗

1.手寫注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginAnnotaion {
}

2.攔截器
@Configuration
public class WebMvcConfigurerTest implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/").excludePathPatterns("/js/","/css/","/images/");
}
}

public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(“攔截了”);
HandlerMethod handlerMethod=(HandlerMethod)handler;
//獲取攔截的方法
LoginAnnotaion loginAnnotaion=handlerMethod.getMethod().getAnnotation(LoginAnnotaion.class);
//該方法有這個注解,放行,不攔截
if(loginAnnotaion!=null){
return true;
}
response.setContentType(“application/json; charset=utf-8”);
response.getWriter().print(“你訪問的資源需要先登錄”);
return false;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}
}

3.controller
@RestController
public class TestController {

//放開
@LoginAnnotaion
@GetMapping("/way/{id}")
public String way(@PathVariable(“id”) Integer id){
return id.toString()+“way”;
}

@GetMapping("/way2/{id}")
public String way2(@PathVariable(“id”) Integer id){
return id.toString()+“way2”;
}
}

場景二:自定義注解+AOP 實現接口執行時間打印

先導入切面和lombok需要的依賴包

org.springframework.boot
spring-boot-starter-aop


org.projectlombok
lombok
true

定義一個注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AopAnnotation {
}

寫一個aop
@Aspect
@Component
@Slf4j
public class LogAspect {

@Pointcut(value = “@within(com.example.loginrequireannotation.annotation.AopAnnotation) || @annotation(com.example.loginrequireannotation.annotation.AopAnnotation)”)
public void logPointCut(){
}

// 3. 環繞通知

3.controller
@AopAnnotation
@RestController
public class AopController {

@LoginAnnotaion
@GetMapping("/user/{id}")
public String way(@PathVariable(“id”) Integer id){
return id.toString()+“user”;
}

@Around(value = "logPointCut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("====== 開始執行 {}.{} ======",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName());
// 記錄開始時間
long begin = System.currentTimeMillis();

// 執行目標 service
Object result = joinPoint.proceed();

// 記錄結束時間
long end = System.currentTimeMillis();
long takeTime = end - begin;
if (takeTime > 3000) {
log.error("====== 執行結束,耗時:{} 毫秒 ======", takeTime);
} else if (takeTime > 2000) {
log.warn("====== 執行結束,耗時:{} 毫秒 ======", takeTime);
} else {
log.info("====== 執行結束,耗時:{} 毫秒 ======", takeTime);
}
return result;
}
}

@LoginAnnotaion
@GetMapping("/teacher/{id}")
public String way2(@PathVariable(“id”) Integer id){
return id.toString()+“teacher”;
}
}

在這里插入圖片描述

<p> <span><span style="font-size:14px;"><strong>一、課程簡介</strong></span></span> </p> <p> <span><span style="color:#E56600;font-size:14px;">  『</span><span style="color:#E56600;font-size:14px;">Java學習指南系列</span><span style="color:#E56600;"></span><span style="color:#E56600;font-size:14px;">』</span></span><span>的第21篇教程 ,MyBatis 篇,是Java系列的高級課程。本篇介紹 MyBatis 的使用方法,使用 MyBatis 進行數據庫開發的相關技術。</span> </p> <p> <span><span></span><span>    MyBatis 是一個基于JDBC的數據庫工具框架,使用它可以快速地實現對數據庫的訪問操作。與之相似的框架還有 af-sql Hibernate。</span><span></span><span style="font-size:14px;"></span><span style="font-size:14px;"></span><br /> </span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> </p> <p> <span><span><strong>二、主要內容 </strong></span><span style="font-size:14px;"><strong></strong></span></span> </p> <span style="color:#3D3D3D;"></span> <p> <span style="font-size:14px;">本篇主要包含以下內容:</span> </p> <p> <span style="font-size:14px;">* 在項目中加入 MyBatis 支持</span> </p> <p> <span style="font-size:14px;">* 基于 MyBatis 的查詢</span> </p> <p> <span style="font-size:14px;">* 基于 MyBatis 的插入,自增主鍵的配置</span> </p> <p> <span style="font-size:14px;">* 基于 MyBatis 的更新與刪除操作</span> </p> <p> <span style="font-size:14px;">* ResultMap 自定義結果映射</span> </p> <p> <span style="font-size:14px;">* Dynamic SQL 動態可變的SQL</span> </p> <p> <span style="font-size:14px;">* 注解方式的 Mapper定義</span> </p> <p> <span style="font-size:14px;">* MyBatis 在Web項目中的應用,全局工廠實例的定義</span> </p> <p> <span style="font-size:14px;">* 添加Log4j支持,輸出MyBatis的日志</span><br /> <span style="font-size:14px;"></span> </p> <p> <span><span style="font-size:14px;"><strong>三、課程體系</strong></span></span> </p> <p> <span><span style="font-size:14px;">〖Java學習指南</span><span style="font-size:14px;">系列</span><span style="font-size:14px;">〗</span></span><span>:包含入門與進階語法,Swing桌面開發,安卓開發,JavaFX開發,網絡通信Socket,數據結構與算法等課程。</span> </p> <p> <span><span style="color:#E56600;font-size:14px;">〖網站開發</span><span style="font-size:14px;">系列</span><span style="color:#E56600;"></span><span style="color:#E56600;font-size:14px;">〗</span></span><span><span style="color:#E56600;font-size:14px;">:</span><span style="font-size:14px;">包含網頁基礎、網站入門、數據庫、網站中級、FreeMarker、網站高級、項目應用、MyBatis、Redis等課程。</span></span> </p>
相關推薦
??2020 CSDN 皮膚主題: 創作都市 設計師:CSDN官方博客 返回首頁
彩票送彩金