@Aspect AOP

3596 ワード

@Asspectエージェントの適用


エージェントをスプリングアプリケーションに適用する場合は、ポイントカットとデバイスからなるコンサルタントを作成し、スプリング空席として登録するだけです.
残りは自動エージェントジェネレータによって自動的に処理されます.
自動エージェントジェネレータは、スプリング空席として登録されているコンサルタントを検索し、スプリング空席にエージェントを自動的に適用します.
(もちろん、ポイントカットに一致する場合は、プロキシを作成します.)
スプリングは@AsspectAnotationで、ポイントカットとアクセサリからなるコンサルタントジェネレータを非常に便利にサポートします.

cf)コメント


@AspectはAspectJプロジェクトが提供するプレゼンテーションであり,観点向けのプログラミングを可能にする.
スプリングはこれを利用してエージェントを通過するAOPを可能にする.

サンプルコード

@Slf4j
@Aspect
public class LogTraceAspect {

    private final LogTrace logTrace;

    public LogTraceAspect(LogTrace logTrace) {
        this.logTrace = logTrace;
    }

    @Around("execution(* hello.proxy.app..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        TraceStatus status = null;
        try {
            final String message = joinPoint.getSignature().toShortString();
            status = logTrace.begin(message);

            //로직 호출
            final Object result = joinPoint.proceed();
            logTrace.end(status);
            return result;
        } catch (Exception e) {
            logTrace.exception(status, e);
            throw e;
        }
    }
}

@Configuration
public class AopConfig {

    @Bean
    public LogTraceAspect logTraceAspect(LogTrace logTrace) {
        return new LogTraceAspect(logTrace);
    }
}
  • @Asspect:匿名エージェントベースのアプリケーションに必要です.
  • @Around("execution( hello.proxy.app..(..))")
  • @Aroundの値にドットカット式を加えます.式はAspectJ式を使用します.
  • @Aroundの方法はAdviceです.
  • 計画JoinPoint接続ポイント:Addiceで見られるメソッドInvocation呼び出しと同様の機能.
  • の内部には、実際にターゲットを呼び出し、パラメータを渡し、どのオブジェクトとどのメソッドを呼び出したかの情報が含まれています.
  • joinPoint.process():実際に呼び出されたターゲットを呼び出します.
  • @Asspectエージェント


    自動エージェントジェネレータは、Advisorを自動的に見つけ、必要な場所でエージェントを作成して適用します.
    自動エージェントジェネレータでは、@Asspectを見つけてAdvisorとして作成する役割も追加できます.
    簡単に言えば@AsspectをAdvisorに変換して保存することもできます.

    自動エージェントジェネレータは2つのことをします。

  • @Asspectを表示し、Advisorに変換して保存します.
  • アドバイザに基づいてプロキシを作成します.
  • 1.@Asspectをアドバイザに変換して保存



    実行
  • :Springアプリケーションのロード時に自動エージェントジェネレータを呼び出します.
  • すべての@Aspect空を検索:自動エージェントジェネレータはSpringコンテナで@Aspect宣言付きSpring空をすべて検索します.
  • 生成
  • Advisor:@Asspect Builderにより@Asspect自動化情報に基づいてAdvisorを生成します.
  • @Asspect Advisor保存:生成されたAdvisorを@Asspected Builderの内部に保存します.
  • @Asspected Builder


    BeanFactoryAssepctJAdvisorBuilderクラス.
    @Asspectの情報に基づいて、Pointcut、Advisor、Advisorを作成および保存します.
    @Asspectの情報に基づいてAdvisorを作成します.
    @Asspectedbyzer builder内部リポジトリにキャッシュします.
    キャッシュにAdvisorが作成されている場合は、キャッシュに格納されているAdvisorを返します.

    2.Advisorベースのエージェントの作成



    1作成:スプリング空のオブジェクトとして作成されます.(beanとすべての素子スキャンを含む)
    2.転送:生成されたオブジェクトを空のリポジトリに登録する前に、空のポストプロセッサに転送します.(自動エージェントジェネレータ)
    3-1. Advisorクエリー:SpringコンテナですべてのAdvisor空をクエリーします.
    3-2. @≪ビューの表示|View|emdw≫:≪コンサルタントの表示|View Advisor|emdw≫:@ビュー・ビルダーの内部に保管されているすべてのコンサルタントを表示します.
    4.エージェント適用オブジェクトを確認する:前の3-1,3-2でクエリーしたアドバイザに含まれるポイントカットを使用して、そのオブジェクトがエージェントに適用されるかどうかを判断します.
    この場合、オブジェクトのクラス情報とそのオブジェクトのすべてのメソッドがポイントカットに一致します.
    したがって,1つの条件を満たす限りエージェントの適用対象となる.
    5.プロキシの作成:プロキシが適用される場合は、プロキシを作成してプロキシに戻ります.このエージェントをspringbinとして登録します.
    エージェントに適用されない場合は、元のオブジェクトを返し、スプリング空席として登録します.

    整理する


    @Aspectを使用して匿名ベースのエージェントを作成できます.