2018-10-18
3236 ワード
Spring boot学習のaop使用とカスタム注釈
厳密に言えば、プログラマーとしての筆者の最初のブログノートです.最近会社のプロジェクトは忙しいですが、入社して1月も経っていない私は、忙しい中でぶらぶらしてもいいです.くだらないことはあまり言わないで、次は本題に入ります.Spring bootは、「新しいSpringアプリケーションの構築と開発を簡素化する」と呼ばれるハイエンドの統合フレームワークで、従来のフレームワークに比べてプロジェクトを開発するのに使われているので、あまり爽やかではありません.今日は仕事の合間にspringbootのdemoを自分で構築して、カスタム注釈を使ってaopの構成を実現しようとしました.springbootプロジェクトを作成し、導入する依存度:
その後、テスト用のコントロールを作成し、
まずプロジェクトを走って、正常に動作することを保証して、フロントエンドで戻り値nameを取得することができて、次に注釈クラスをカスタマイズして、aop構成クラスの中で使います.
次にaop構成クラスを作成し、クラスに注記@Aspect@Componentが必要です.その後もwhere when whatです.コードは次のとおりです.
ここのProceedingJoinPointオブジェクトは、呼び出し方法
厳密に言えば、プログラマーとしての筆者の最初のブログノートです.最近会社のプロジェクトは忙しいですが、入社して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;
}