Javaスタディノート(アスペクトプログラミングのAOP)

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中最强大的通知,它可以同时实现前置通知和后置通知,它保留了调度被代理对象的原有方法功能,所以它既强大,又灵活,但是可控性不强,如果不需要大量的改业务逻辑,一般而言不需要使用。

おすすめ

転載: blog.csdn.net/cyb_123/article/details/107510671