2、註解的原理

1、註解英文稱 Annotaion,是Java從1.5開始支持加入源碼的特殊語法元數據,作爲程序的元數據嵌入到程序當中。註解實現有一個重要的接口Annotation接口,利用@interface關鍵字,將所有使用該關鍵字的註解類都實現Annotation接口。Annontation像一種修飾符一樣,應用於包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。

使用註解的好處:1、幫助代碼編譯檢查,2、提高代碼的識別度,比如 @override @Deprecated , 3、減少重複代碼,簡化代碼、4、根據註解生成幫助文檔,如 @Decument 等

2、註解的基本語法:

@Target({ElementType.METHOD, ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface AnnotationName{
  
 }

3、元註解就是註解的註解,用來描述註解的。

@Retention 定義該註解的生命週期

RetentionPolicy.SOURCE :作用於源碼階段,比如常見的 @Override, @SuppressWarnings;
RetentionPolicy.CLASS :作用於字節碼階段
RetentionPolicy.RUNTIME :作用於運行階段
@Target 定義該註解的作用範圍 

ElementType.TYPE :用於註解到類,接口、枚舉類
ElementType.FIELD:字段,包括枚舉類常量
ElementType.METHOD:方法聲明
ElementType.PARAMETER:參數聲明
ElementType.CONSTRUCTOR:構造器聲明
ElementType.LOCAL_VARIABLE :局部變量聲明
ElementType.ANNOTATION_TYPE :用於註解聲明,即註解的註解,元註解
ElementType.PACKAGE :包聲明
其他註解

@Document 註解將生成到javadoc中
@Deprecated  表示過時的類
@Inherited 是否允許子類繼承該註解
@SuppressWarnings 編譯器忽略掉無法識別的警告名
@Override 標註的方法重載了父類的方法

4、自定義註解

/**
  *  自定義註解
   *
   */
  @Target({ElementType.TYPE,ElementType.METHOD})
  @Retention(RetentionPolicy.RUNTIME)
  public @interface MyAnnotation {

      String [] value() default "";

 }

第一步:定義註解接口

import java.lang.annotation.*;
  
  /**
   * 打印出入參數日誌
   */
  @Target({ElementType.METHOD})      //定義該註解的作用範圍
  @Retention(RetentionPolicy.RUNTIME)//定義該註解的生命週期
  @Documented                        //註解將生成到javadoc中
  public @interface OuterService {
     /**
      * 默認打印輸入參數
      * @return
      */
     boolean isInLog() default true;
 
     /**
      * 默認打印輸出參數
      * @return
      */
     boolean isOutLog() default true;
 
 }

 

/**
 * @description: 日誌攔截器
 * @author: xxx
 * @createdate: 
 * @lastdate:
 */
@Order(1000) //使用order屬性,設置該類在spring容器中的加載順序
@Aspect      //作用是把當前類標識爲一個切面供容器讀取
@Component   //把普通類實例化到spring容器中
public class OuterServiceAop {


  //此處定義一個通用的切點,以便下方4個通知使用
  @Pointcut("@annotation(com.jd.xxx.api.service.aop.OuterService)")
  public void serviceAop() {
  }

  @AfterThrowing("serviceAop()")
  public void logAfterThrow() {
  }

  /**
   * 正常
   * 異常
   * 顯示參數名稱編譯的時候需要javac -parameters進行編譯即可
   *
   * @param jp
   */
  @Around("serviceAop()") //環繞增強,相當於MethodInterceptor
  public Object around(ProceedingJoinPoint jp) {
    Object result = null;
    Signature signature = jp.getSignature();
    MethodSignature methodSignature = (MethodSignature) signature;
    Method method = methodSignature.getMethod();
    OuterService serviceAnnotation = method.getAnnotation(OuterService.class);
    Object[] args = jp.getArgs();
    Parameter[] parameters = method.getParameters();
    RequestContext context = initRequestContext(args, parameters);
    init(context);
    logRequestParameters(method, serviceAnnotation, args, parameters, context);

  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章