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);
}
}