packagecom.example;importcom.example.config.*;importcom.example.trace.LogTrace;importcom.example.trace.ThreadLocalLogTrace;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Import;//@Import({AppV1Config.class, AppV2Config.class})//@Import(InterfaceProxyConfig.class)//@Import(ConcreteProxyConfig.class)//@Import(DynamicProxyBasicConfig.class)//@Import(DynamicProxyFilterConfig.class)//@Import(ProxyFactoryConfigV1.class)//@Import(ProxyFactoryConfigV2.class)//@Import(BeanPostProcessorConfig.class)//@Import(AutoProxyConfig.class)@Import(AopConfig.class)@SpringBootApplication(scanBasePackages="com.example.app.v3")//컨트롤러때문에 생기는 충돌 방지publicclassChapter2Application{publicstaticvoidmain(String[]args){SpringApplication.run(Chapter2Application.class,args);}@BeanpublicLogTracelogTrace(){returnnewThreadLocalLogTrace();}}
테스트
3가지 애플리케이션에 모두 접속해보면 로그가 잘 출력되는 것을 확인할 수 있다.
http://localhost:8082/v1/request?itemId=test
http://localhost:8082/v2/request?itemId=test
http://localhost:8082/v3/request?itemId=test
@Aspect 프록시 - 설명
자동 프록시 생성기는 어드바이저를 자동으로 찾아와서 필요한 곳에 프록시를 생성하고 적용해준다.
이에 추가로 @Aspect를 찾아서 이것을 어드바이저로 만들어준다.
@Aspect를 어드바이저로 변환해서 저장하는 과정
실행
스프링 애플리케이션 로딩 시점에 자동 프록시 생성기를 호출한다.
모든 @Aspect 빈 조회
자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 애노테이션이 붙은 스프링 빈을 모두 조회한다.
어드바이저 생성
@Aspect 어드바이저 빌더를 통해 @Aspect 애노테이션 정보를 기반으로 어드바이저를 생성한다.
@Aspect 기반 어드바이저 저장
생성한 어드바이저를 @Aspect 어드바이저 빌더 내부에 저장한다.
자동 프록시 생성기의 작동 과정
생성
스프링 빈 대상이 되는 객체를 생성한다.
@Bean이나 컴포넌트 스캔을 모두 포함한다.
전달
생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달한다.
어드바이저 조회
Advisor 빈 조회
스프링 컨테이너에서 어드바이저 빈을 모두 조회한다.
@Aspect Advisor 조회
@Aspect 어드바이저 빌더 내부에 저장된 어드바이저를 모두 조회한다.
프록시 적용 대상 체크
3번의 2가지 케이스에서 조회한 어드바이저에 포함되어 있는 포인트컷을 통해 해당 객체에 대한 프록시 적용 여부를 판단한다.
이 때, 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭해본다.