본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!
BeanPostProcessor
을 구현하면 사용할 수 있다.postProcessBeforeInitialization
: 객체 생성 이후에 @PostConstruct
같은 초기화가 발생하기 전에 호출되는 포스트 프로세서postProcessAfterInitialization
: 객체 생성 이후에 @PostConstruct
같은 초기화가 발생한 다음에 호출되는 포스트 프로세서🎈 예시
@Slf4j
static class AtoBPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("beanName={} bean={}", beanName,bean);
if(bean instanceof A) {
return new B();
}
return bean;
}
}
먼저 이 기능을 사용하려면 다음의 디펜던시가 필요하다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
aspectJ
라는 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.
스프링 부트 자동 설정으로 AnnotationAwareAspectJAutoProxyCreator
라는 빈 후처리기가 스프링 빈에 자동 등록된다.
Advisor
들을 자동으로 찾아서 프록시가 필요한 곳에 자동으로 프록시를 적용해준다.Advisor
에는 Pointcut
이 포함되어 있다. 즉, Pointcut
의 정보로 [어떤 객체에], [어느 메소드에] 적용해야 하는지 알 수 있고, 그 정보를 바탕으로 프록시를 생성해준다.
🎈 자동 프록시 생성기의 작동 과정
생성: 스프링이 스프링 빈 대상이 되는 객체를 생성
전달: 빈 후처리기에 생성된 객체를 전달
모든 Advisor 빈 조회: 자동 프록시 생성기가 스프링 컨테이너에서 모든 Advisor
을 조회
프록시 적용 대상 체크: Advisor
내에 있는 Pointcut
을 이용해 모든 클래스와 메서드를 하나하나 매칭해본다. 이때 조건이 하나라도 만족하면 프록시 적용 대상이 된다.
프록시 생성: 프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다.
🎈 주의
Pointcut
을 잘 작성해 원하는 프록시만 만드는게 중요하다.AspectJ
를 주로 사용한다.AspectJ
은 다음에 더 자세히 알아보도록 하자.Advisor
을 빈으로 등록만 하면 스프링이 알아서 찾아서 빈 후처리기에 등록해준다.@Configuration
public class AutoProxyConfig {
@Bean
public Advisor advisor(LogTrace logTrace) {
//pointCut
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* hello.proxy.app..*(..)) && !execution(* hello.proxy.app..noLog(..))");
//advice
LogTraceAdvice advice = new LogTraceAdvice(logTrace);
return new DefaultPointcutAdvisor(pointcut, advice);
}
}
execution(* hello.proxy.app..*(..)) && !execution(* hello.proxy.app..noLog(..))
*
: 모든 반환 타입hello.proxy.app..
: 해당 패키지와 그 하위 패키지*(..)
: 모든 메서드(*), 파라미터는 상관 없음(..)&&
: 두 조건을 모두 만족!
: 반대Advisor1
과 Advisor2
가 있다 가정하자.advisor
을 포함할 수 있기 때문에 프록시를 여러 개 생성해서 낭비할 필요가 없다.🎈 프록시 자동 생성기 상황별 정리
advisor1
의 포인트컷만 만족advisor1
, advisor2
의 포인트컷을 모두 만족advisor1
,advisor2
의 포인트컷을 모두 만족하지 않음인프런의 '스프링 핵심 원리 고급편(김영한)'을 스스로 정리한 글입니다.
자세한 내용은 해당 강의를 참고해주세요.