2018-10-18

3236 ワード

Spring boot学習のaop使用とカスタム注釈
厳密に言えば、プログラマーとしての筆者の最初のブログノートです.最近会社のプロジェクトは忙しいですが、入社して1月も経っていない私は、忙しい中でぶらぶらしてもいいです.くだらないことはあまり言わないで、次は本題に入ります.Spring bootは、「新しいSpringアプリケーションの構築と開発を簡素化する」と呼ばれるハイエンドの統合フレームワークで、従来のフレームワークに比べてプロジェクトを開発するのに使われているので、あまり爽やかではありません.今日は仕事の合間にspringbootのdemoを自分で構築して、カスタム注釈を使ってaopの構成を実現しようとしました.springbootプロジェクトを作成し、導入する依存度:
org.springframework.boot
  spring-boot-starter-aop


org.springframework.boot
  spring-boot-starter-web


その後、テスト用のコントロールを作成し、
@RestController
public class TestController {
    @GetMapping("/test/{name}")
    @LogAnnotation
    public String getUser(@PathVariable String name){
        return name;
    }
}

まずプロジェクトを走って、正常に動作することを保証して、フロントエンドで戻り値nameを取得することができて、次に注釈クラスをカスタマイズして、aop構成クラスの中で使います.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
}

次にaop構成クラスを作成し、クラスに注記@Aspect@Componentが必要です.その後もwhere when whatです.コードは次のとおりです.
@Aspect
@Component
@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
public class TestAspect {
    @Autowired
    private LoginfoService loginfoService;

    //where when,  LogAnnotation   Controller      
    @Pointcut(("execution(* cn.aop.demo.web..*.*(..)) && @annotation(cn.aop.demo.anno.LogAnnotation)"))
    public void logAdvice(){}
    //what,  aop        
    @Around("logAdvice()")
    public Object doLogAdvice(ProceedingJoinPoint pjp){
        Object result = null;
        Signature signature = pjp.getSignature();
        if (!(signature instanceof MethodSignature)) {
            throw new IllegalArgumentException("           ");
        }

        loginfoService.printLog();
        try {
            result = pjp.proceed();
        }catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return result;
    }
}

ここのProceedingJoinPointオブジェクトは、呼び出し方法proceed()を忘れないでください.そうしないと、プログラムはここに詰まって、下に実行されません.この場合、オブジェクトのcontrollerメソッドに指定した注釈を貼り付けてコントローラにアクセスすると、aopフェースの強化がトリガーされ、設定したビジネスメソッドが呼び出されます.また、aop構成クラス上の注記、@EnableAspectJAutoProxyについては、aopを制御する具体的な実装方法と、trueの場合cglib、falseの場合javaのProxy、デフォルトfalse、2番目のパラメータ制御代理の暴露方法の2つのパラメータを簡単に紹介し、内部呼び出しでエージェントを使用できないシーンを解決し、デフォルトはfalse.ソースコードは以下の通りです.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

    /**
     * Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
     * to standard Java interface-based proxies. The default is {@code false}.
     */
    boolean proxyTargetClass() default false;

    /**
     * Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}
     * for retrieval via the {@link org.springframework.aop.framework.AopContext} class.
     * Off by default, i.e. no guarantees that {@code AopContext} access will work.
     * @since 4.3.1
     */
    boolean exposeProxy() default false;

}