728x90
반응형
728x90
BeanPostProcessor
- 빈을 생성하고 의존성 주입이 끝난 후 빈의 초기화 메서드가 호출되기 전에 혹은 호출된 후에 추가적인 작업
- 객체를 빈 저장소에 등록하기 전 조작이 필요할 때 사용
- 컴포넌트 스캔을 사용하는 클래스를 프록시로 감싸 빈 등록 가능
구성 요소 (인터페이스)
- BeanPostProcessor 인터페이스를 상속받아 구현
postProcessBeforeInitialization
- 빈 초기화 전 호출되는 메서드
- 빈을 수정하거나 필요한 전처리 가능
- default로 정의되어 상속 후 구현하지 않아도 됨
postProcessAfterInitialization
- 빈 초기화 후 호출되는 메서드
- 빈 상태가 초기화 된 후 호출되어 후처리나 프록시 추가 가능
- default로 정의되어 상속 후 구현하지 않아도 됨
초기화 후 빈을 프록시로 감싸 등록하는 예제
public class MyBeanPostProcessor implements BeanPostProcessor {
private final Advisor advisor; //Advisor를 외부에서 주입 받는다고 가정
//생성자 주입
public MyBeanPostProcessor(Advisor advisor) {
this.advisor = advisor;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//프록시 적용 여부 검사
if (bean instanceof MyBean && beanName.startsWith("myBean")) {
log.info("Creating proxy for={}", beanName);
//ProxyFactory로 프록시 생성
ProxyFactory proxyFactory = new ProxyFactory(bean);
proxyFactory.addAdvisor(advisor); // Advisor 추가
// 프록시 객체 반환
return proxyFactory.getProxy();
}
return bean; //프록시 대상이 아닌 경우 원본 빈 반환
}
}
스프링 빈 후처리기
- 스프링에서 제공하는 빈 후처리기
- 스프링 AOP 기술로 aspectjweaver 라이브러리를 통해 스프링 부트가 aop 관련 클래스를 자동으로 빈 등록
AutoProxyCreator - 자동 프록시 생성기
- 스프링 부트 자동 설정으로 AnnotationAwareAspectJAutoProxyCreator 빈 후처리기가 스프링 빈에 자동 등록
- 스프링 빈으로 등록된 Advisor들을 찾아 프록시가 필요한 곳에 자동으로 프록시 적용
- 포인트 컷을 사용한 조건 검사
- 포인트 컷 조건에 맞는 메서드가 존재한다면 프록시 적용
- 조건에 맞는 Advisor가 여러 개라면 여러 개의 Advisor가 등록된 프록시 생성
- 각 Advisor에 맞는 여러 개의 프록시가 생성되는 것이 아닌 1개의 프록시가 여러 개의 Advisor를 가짐
동작 과정
- 생성
- 스프링이 스프링 빈 대상이 되는 객체를 생성
- @Bean, 컴포넌트 스캔 모두 포함
- 전달
- 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달
- 모든 Advisor 빈 조회
- 빈 후처리기는 스프링 컨테이너에서 모든 Advisor를 조회
- 프록시 적용 대상 체크
- 조회한 Advisor에 포함되어 있는 포인트컷을 사용해서 해당 객체가 프록시를 적용할 대상인지 아닌지 판단
- 객체의 클래스 정보, 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭
- 조건이 하나라도 만족하면 프록시 적용 대상
- 프록시 생성
- 프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록
- 적용 대상이 아니라면 원본 객체를 빈으로 등록
- 빈 등록
- 반환된 객체 빈 등록
스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런 강의 내용 참고
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] Spring AOP - Pointcut (2) | 2024.11.10 |
---|---|
[Spring] AOP - Aspect-Oriented Programming 개념 (0) | 2024.11.08 |
[Spring] ProxyFactory (1) | 2024.11.06 |
[Spring] 동적 프록시 (0) | 2024.11.05 |
[Spring] Proxy & Decorator Pattern (0) | 2024.11.02 |