자동 프록시 생성기와 @Aspect
자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)는 Advisor를 자동으로 찾아와서 필요한 곳에 프록시를 생성하고 적용한다. 그리고 추가로 하나의 역할을 더 하는데, @Aspect를 찾아서 이것을 Advisor로 만드는 일이다.
즉, 자동 프록시 생성기는 크게 두가지 일을 수행한다.
- @Aspect를 보고 Advisor로 변환하여 저장
- 어드바이저를 기반으로 프록시를 생성
1
2
3
4
5
6
7
8
9
10
// 어드바이저(Advisor)
@Aspect
public class LogTraceAspect {
// 포인트컷(Pointcut) 어노테이션 선언
@Around("execution(* hello.proxy.app..*(..))")
// 어드바이스(Advice) 구현부
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
}
}
@Aspect를 어드바이저로 변환하여 저장하는 과정
- 실행
- 스프링 어플리케이션 로딩 시점에 자동 프록시 생성기 호출
- 모든 @Aspect 빈 조회
- 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 어노테이션이 붙은 스프링 빈을 모두 조회
- 어드바이저 생성
- @Aspect 어드바이저 빌더를 통해 @Aspect 어노테이션 정보를 기반으로 어드바이저 생성
- @Aspect 기반 어드바이저 저장
- 생성한 어드바이저를 @Aspcect 어드바이저 빌더 내부에 저장
@Aspect 어드바이저 빌더 @Aspect의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관하는 것을 담당. @Aspect의 정보를 기반으로 어드바이저를 만들고, @Aspect 어드바이저 빌더 내부 저장소에 캐시한다.
어드바이저를 기반으로 프록시 생성 과정
- 생성
- 스프링 빈 대상이 되는 객체 생성
- @Bean, 컴포넌트 스캔 모두 포함
- 전달
- 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달
- Advisor 빈 조회
- 스프링 컨테이너에서 Advisor 빈을 모두 조회
- @Aspect Adisor 조회
- @Aspect 어드바이저 빌더 내부에 저장된 Advisor를 모두 조회
- 프록시 적요 대상 체크
- 앞서 조회한 Advisor에 포함된 포인트컷을 사용하여 해당 객체가 프록시를 적용할 대상인지 아닌지 판단
- 판단시 객체의 클래스 정보와 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭
- 조건이 하나라도 만족시 프록시 적용대상으로 판단
- 앞서 조회한 Advisor에 포함된 포인트컷을 사용하여 해당 객체가 프록시를 적용할 대상인지 아닌지 판단
- 프록시 생성
- 프록시 적용 대상이면 프록시를 생성하고 프록시를 반환후, 프록시를 스프링 빈으로 등록
- 프록시 적용 대상이 아니면 원본 객체를 스프링 빈으로 등록
- 프록시 적용 대상이면 프록시를 생성하고 프록시를 반환후, 프록시를 스프링 빈으로 등록
- 빈 등록
- 반환된 객체는 스프링 빈으로 등록
참고
- 스프링 핵심 원리 - 고급편(김영한)