4つの要素に関する注記
1. @ターゲット
アノテーションが使用される場所を示します
public enum ElementType { TYPE、クラス、インターフェース(アノテーションタイプを含む)またはenum宣言FIELD、ドメイン宣言(enumインスタンスを含む)METHOD、メソッド宣言PARAMETER、パラメーター宣言CONSTRUCTOR、コンストラクター宣言LOCAL_VARIABLE、ローカル変数宣言ANNOTATION_TYPE、注釈型宣言PACKAGE、パッケージ宣言TYPE_PARAMETER、型パラメータ宣言TYPE_USEタイプ利用}
2. @保持
アノテーションを保存できる範囲を示します
public enum RetentionPolicy { SOURCE、source code:このアノテーションは、ソースコードにのみ保存できます。コンパイルすると、破棄されます。CLASS、クラスファイル:このアノテーションは、クラスファイルに保持できますが、 jvmはRUNTIMEランタイムを破棄します。つまり、このアノテーションは実行時に保持でき、リフレクションとリフレクションを通じて取得できます}
3. @文書化
つまり、このアノテーションが付いた要素は、javadocなどのツールでドキュメント化できます。つまり、この注釈はjavadocツールによってドキュメントに抽出されます。この注釈の情報内容が異なるため、ドキュメントドキュメントの内容は異なります。@ return、@ paramなどに非常に似ています。
4. @継承
サブクラスが親クラスの注釈を継承できるようにします。つまり、この注釈を持つ要素の子クラスは、親クラスの注釈を継承できます。
インターセプター実装のデモ
@Component //让IOC容器管理
@Aspect //定义切面类
@Order(0) //设置优先级,值越低优先级越高
public class TestAspect {
/**
* 系统状态处理切入点
*/
@Pointcut("execution(* com.test.aop.service.*.*(..))")
public void testPointCut() {
}
@Before("testPointCut()")
public void before(JoinPoint joinPoint) {
//方法名
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//参数名称
String[] params = methodSignature.getParameterNames();
//参数值
Object[] args = joinPoint.getArgs();
//获得注解信息
LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class);
for (int i = 0 ; i <params.length; i++) {
System.out.println(params[i]+ " = "+ args[i]);
}
}
@After("testPointCut()")
public void after (JoinPoint joinPoint) {
}
@AfterReturning(pointcut = "testPointCut()",returning = "returning")
public Object afterReturn(JoinPoint joinPoint, Object returning) {
}
/**
* 系统状态处理
*
* @param point 处理加入点
* @return 返回结果
*/
@Around("testPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
String classPath = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
//获取参数名称、参数值
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//取得参数
String[] params = methodSignature.getParameterNames();
//参数值
Object[] args = joinPoint.getArgs();
for (int i = 0; i < params.length; i++) {
System.out.println(params[i]+" = "+args[i]);
}
//取注解
LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class);
System.out.println("value= "+logAnnotation.value()+",des ="+logAnnotation.description());
Object result = result =joinPoint.proceed(args);
return result;
}
//异常执行
@AfterThrowing(pointcut = "testPointCut()",throwing = "err")
public void throwing(Throwable err) {
}
}
@Around的作用
环绕通知是SpringAOP中最强大的通知,它可以同时实现前置通知和后置通知,它保留了调度被代理对象的原有方法功能,所以它既强大,又灵活,但是可控性不强,如果不需要大量的改业务逻辑,一般而言不需要使用。