BeanPostProcessor

목차

참고

본 포스트는 김영한의 스프링 핵심 원리 - 고급편 내용을 참고해 만들었습니다.

BeanPostProcessor

Spring Bean 을 등록하는 시점에 특정 로직을 수행하기 위해 사용하는 hook (LifeCycle 에 간섭할 수 있다.)
Spring Bean 전체에 공통 로직을 수행할 때 사용하면 유용하다

BeanPostProcessor 는 Bean 의 생성과 초기화를 제어하는 인터페이스입니다. 이 인터페이스를 사용하면 스프링 빈이 생성되고 초기화되는 과정에서 추가적인 작업을 수행할 수 있습니다. 예를 들어, 스프링 빈의 필드를 초기화하거나, 빈 객체의 프록시를 생성하는 등의 작업을 수행할 수 있습니다.

BeanPostProcessor 인터페이스

public interface BeanPostProcessor {

@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
  • postProcessBeforeInitialization
    • Bean 이 초기화되기 전에 호출되는 메소드
  • postProcessAfterInitialization
    • Bean 이 초기화된 후에 호출되는 메소드

BeanPostProcessor 생성

BeanPostProcessor 인터페이스를 구현한 AToBPostProcessor 에서는 Bean 이 초기화 된후 넘어온 객체가 A 일 경우 B 객체로 새로 생성해 반환한다.

@Slf4j
static class AToBPostProcessor implements BeanPostProcessor{
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("beanName = {} bean = {}", beanName, bean);

// 넘어온 Bean 이 A 객체일 경우 B 를 반환한다.
if(bean instanceof A){
return new B();
}

return bean;
}
}
@Test
void BasicConfig(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanPostProcessorConfig.class);

// beanA 이름으로 B 객체가 Bean으로 등록된다.
B b = applicationContext.getBean("beanA", B.class);
b.helloA();

// A 는 빈으로 등록되지 않는다.
assertThrows(NoSuchBeanDefinitionException.class, () -> {
applicationContext.getBean(A.class);
});
}

@Slf4j
@Configuration
static class BeanPostProcessorConfig{
@Bean(name = "beanA")
public A a(){
return new A();
}

// Bean 후처리기 AToBPostProcessor 를 Bean 으로 등록한다.
@Bean
public AToBPostProcessor helloPostProcessor () {
return new AToBPostProcessor();
}
}

@Slf4j
static class A{
public void helloA(){
log.info("hello A");

}
}

@Slf4j
static class B{
public void helloA(){
log.info("hello B");

}
}
09:39:32.378 [Test worker] INFO hello.proxy.postprocessor.BasicTest$AToBPostProcessor - beanName = beanA bean = hello.proxy.postprocessor.BasicTest$A@4b4dd216
09:39:32.398 [Test worker] INFO hello.proxy.postprocessor.BasicTest$B - hello B
Share