Springカスタム注釈の実装

3885 ワード

JAvaはjdk 1.5に注釈を導入し,springフレームワークもjava注釈を十分に発揮している.
次にSpringで注釈をカスタマイズする方法を簡単に説明します.ここではspringフレームワークのAOP(フェースプログラミング向け)を使用します.
 
一、カスタム注釈の作成
 
まずカスタム注釈LogAnnotationを作成し、descはカスタムパラメータです.
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited()
public @interface LogAnnotation {
    String desc();
}

 
二、解析注記
 
次に,springのAOP(接面プログラミング向け)特性を用いた注釈の解析作業を完了する.
 
@Aspect注記でこのクラスを切面クラスにする
@Pointcutで切り込み点を指定します.ここで指定した切り込み点はLogAnnotation注記タイプ、つまり@LogAnnotation注記で修飾された方法で、その切り込み点に入ります.
  • @Before先行通知:ある接続ポイントの前に実行された通知ですが、この通知は、例外が放出されない限り、接続ポイントの前の実行プロセスをブロックできません.
  • @Aroundオービット通知:メソッド実行前後の操作を実現でき、メソッド内でpoint.proceed()を実行する必要がある.結果を返します.
  • @AfterReturning後置通知:接続ポイントが正常に完了した後に実行される通知:たとえば、メソッドに異常が投げ出されず、正常に戻ります.
  • @AfterThrowing異常通知:メソッドが異常終了を投げ出したときに実行される通知.
  • @After後置通知:接続ポイントが正常に完了した後に実行される通知:たとえば、メソッドに異常が投げ出されず、正常に戻ります.
  • package com.blue.module.annotation;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    import java.lang.reflect.Method;
    
    @Aspect //AOP   
    @Component
    public class CommonLogAspect {
    
        /*  @Pointcut      ,         LogAnnotation    ,   
           @LogAnnotation       ,      */
        @Pointcut(value = "@annotation(com.blue.module.annotation.LogAnnotation)")
        private void pointcut() {
    
        }
    
        /**
         *        
         *
         * @param point
         * @param logA
         * @return
         */
        @Around(value = "pointcut() && @annotation(logA)")
        public Object around(ProceedingJoinPoint point, LogAnnotation logA) {
    
            System.out.println("   around  ");
    
            String msg = logA.desc();
            //     
            Class clazz = point.getTarget().getClass();
            //     
            Method method = ((MethodSignature) point.getSignature()).getMethod();
    
            System.out.println("    :" + clazz + "   :" + method + "      :" + msg);
    
            try {
                return point.proceed(); //    
            } catch (Throwable throwable) {
                throwable.printStackTrace();
                return throwable.getMessage();
            }
        }
    
        /**
         *      
         *
         * @param joinPoint
         * @param logA
         * @param result
         * @return
         */
        @AfterReturning(value = "pointcut() && @annotation(logA)", returning = "result")
        public Object afterReturning(JoinPoint joinPoint, LogAnnotation logA, Object result) {
            System.out.println("   afterReturning  : result=" + result);
            return result;
        }
    
        /**
         *            
         *
         * @param joinPoint
         * @param logAnnotation
         * @param ex
         */
        @AfterThrowing(value = "pointcut() && @annotation(logAnnotation)", throwing = "ex")
        public void afterThrowing(JoinPoint joinPoint, LogAnnotation logAnnotation, Exception ex) {
            System.out.println("   afterThrowing  ");
            System.out.println("  :" + logAnnotation.desc() + "     ");
        }
    
    }

    三、カスタム注釈の使用
    コントロールで注記@LogAnnotationを直接使用
    @RestController
    public class TestController{
    
        @LogAnnotation(desc="My annotation")
        @RequestMapping("/hello")
        public String hello() {
            return "hello";
        }
    }

     
    プロジェクトの開始、アクセスhttp://localhost:8080/hello
     
    結果
       around  
        :class com.blue.module.controller.TestController   :public java.lang.String com.blue.module.controller.TestController.hello()      :My annotation
       afterReturning  : result=hello

     
    以上が,おおよそのSpringでカスタム注釈を実現する簡単な流れである.