[スプリング入門]7AOP


✍ AOP


共通の注目点とコアの注目点
❗AOPがない場合は、会員加入時間と会員閲覧時間を計測するコードを作成する
package hello.hellospring.service;

@Transactional
public class MemberService {

 	/**
 	* 회원가입
 	*/
 	public Long join(Member member) {
    
 		long start = System.currentTimeMillis();
        
 		try {
 			validateDuplicateMember(member); //중복 회원 검증
 			memberRepository.save(member);
 			return member.getId();
 		} finally {
 			long finish = System.currentTimeMillis();
 			long timeMs = finish - start;
 			System.out.println("join " + timeMs + "ms");
 		}
 	}
 	
    /**
 	* 전체 회원 조회
 	*/
 	public List<Member> findMembers() {
    
 		long start = System.currentTimeMillis();
        
 		try {
 			return memberRepository.findAll();
 		} finally {
 			long finish = System.currentTimeMillis();
 			long timeMs = finish - start;
 			System.out.println("findMembers " + timeMs + "ms");
 		}
 	}
}
🌱
このようなコードには、次のような問題があります.
  • 会員が加入し、会員照会時間の測定機能は核心的な注目事項ではない.
  • 時間測定の論理は共通の関心の問題である.
  • 測定
  • 時間の論理とコアビジネスの論理が混在し、メンテナンスが困難である.
  • 測定
  • 時間の論理を単独の汎用論理に変えることは難しい.
  • 測定
  • 時間の論理を変更する場合は、すべての論理を検索して変更します.
  • 「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;
    
    @Aspect
    @Component
    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 {
                Object result = joinPoint.proceed();
                return joinPoint.proceed();
            } finally {
                long finish = System.currentTimeMillis();
                long timeMs = finish - start;
                System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
            }
        }
    }

    解決する

  • 会員加入、会員照会などの中核的関心事項と測定時間の共通関心事項を分ける.
  • 測定
  • 時間の論理を独立した汎用論理に変えた.
  • コアの注目点を清潔に保つ.
  • を変更する必要がある場合は、この論理を変更するだけです.
  • で希望する適用対象を選択できます.
  • 「スプリングAOP運動説明」


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

    AOP適用後の依存関係
    🌱
    プロキシ・テクノロジーを使用して偽のメンバー・サービスを呼び出し、ポイントに接続します.()を続行すると、実際のメンバー・サービスが呼び出されます.
    AOP適用前の全図

    AOP適用後の全図