정의
마커 인터페이스 확인이나 프록시로 빈을 래핑하는 등 새 빈 인스턴스의 사용자 정의 수정을 허용하는 팩토리 훅이다.
일반적으로 마커 인터페이스 등을 통해 빈을 채우는 포스트 프로세서는 postProcessBeforeInitialization(java.lang.Object, java.lang.String)
을 구현하고, 프록시로 빈을 래핑하는 포스트 프로세서는 일반적으로 postProcessAfterInitialization(java.lang.Object, java.lang.String)
을 구현한다.
등록
ApplicationContext
는 빈 정의에서 BeanPostProcessor
빈을 자동 감지하고 이후에 생성되는 모든 빈에 해당 포스트프로세서를 적용할 수 있다.
일반 BeanFactory
를 사용하면 BeanPostProcessor
를 프로그래밍 방식으로 등록하여 빈 팩토리를 통해 생성된 모든 빈에 적용할 수 있다.
순서
ApplicationContext
에서 자동 감지되는 BeanPostProcessor
빈은 PriorityOrdered
및 Ordered
시맨틱에 따라 정렬된다.
반대로, BeanFactory에 프로그래밍 방식으로 등록된 BeanPostProcessor
빈은 등록 순서대로 적용되며, 프로그래밍 방식으로 등록된 포스트프로세서에 대해서는 PriorityOrdered
또는 Ordered
인터페이스 구현을 통해 표현된 모든 순서 지정 시맨틱이 무시된다.
또한 @Order
어노테이션은 BeanPostProcessor
빈에 대해서는 고려되지 않는다.
실행 시점
빈을 생성하는 과정 중 초기화 단계에서 실행된다.
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
invokeAwareMethods(beanName, bean);
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessors#beforeInitialization를 실행한다.
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null), beanName, ex.getMessage(), ex);
}
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessors#afterInitialization를 실행한다.
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
주요 구현 클래스
ConfigurationClassPostProcessor
@Configuration
과@Bean
을 이용해 새로운 빈을 등록하는 역할을 한다.
AutowiredAnnotationBeanPostProcessor
@Autowired
가 붙은 필드를 찾아서 빈 의존 관계를 설정해준다.
CommonAnnotationBeanPostProcessor
@PostConstruct
가 붙은 메소드를 빈이 초기화 된 뒤에 호출해주는 기능을 제공한다.
'스프링' 카테고리의 다른 글
@Async 정리 (0) | 2025.01.02 |
---|---|
이벤트 리스너 정리 (0) | 2025.01.02 |
@EnableWebMvc를 붙이지 않은 이유 (0) | 2024.09.23 |
Spring에서의 Filter 간단 정리 (2) | 2024.09.19 |
SpringBoot에서 HTTP 요청을 처리하는 과정을 살펴보며 (DispatcherServlet) (0) | 2024.08.26 |