[6] AOP


AOPが必要

  • のすべてのメソッドの呼び出し時間を測定したい場合は?
  • 共通注目点とコア注目点
  • 会員登録時間、会員照会時間

  • 質問する
    会員登録、会員照会で時間を測定する機能は核心的な注目事項ではない.
    時間を測定する論理は共通の関心の問題である.
    時間測定ロジックとコアビジネスロジックが混在しており、メンテナンスが困難です.
    測定時間の論理を単独の汎用論理に変えることは難しい.
    測定時間の論理を変更する場合は、すべての論理を検索して変更します.

    AOPの適用


    AOP: Aspect Oriented Programming
    共通の注目点とコアの注目点を区別する

    登録タイミングAOP
    package hello.hellospring.aop;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class TimeTraceAop {
      
     @Around("execution(* hello.hellospring..*(..))")
     public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
       long start = System.currentTimeMillis();
       System.out.println("START: " + joinPoint.toString());
       
       try {
         	return joinPoint.proceed();
       } finally {
           long finish = System.currentTimeMillis();
           long timeMs = finish - start;
           System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
                              "ms");
        }
      }
    }
    解決する
    会員加入、会員照会などの中核的な関心事項と測定時間の共通の関心事項を分ける.
    測定時間の論理を独立した汎用論理に変えた.
    コアの注目点を清潔に保つ.
    変更が必要な場合は、このロジックを変更するだけです.
    必要な適用オブジェクトを選択できます.

    スプリングのAOP挙動を記述する


    AOPを適用する前の依存関係

    AOP適用後の依存関係

    コントローラがサービスを注入すると、エージェントという偽のサービスが呼び出され、Pointに参加する.プロセス()が完了したら、実際のサービスを呼び出します.
    AOP適用前の全図

    AOP適用後の全図