빈 후처리기
업데이트:
스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하기 위해 사용한다.
빈 후처리기 기능
-
객체를 조작하거나, 완전히 다른 객체로 바꿔치기 하는 것도 가능.
- 생성 : 스프링 빈 대상이 되는 객체를 생성(@Bean, 컴포넌트 스캔 등)
- 전달 : 생성된 객체를 빈 저장소에 등록하기 전에 후처리기로 전달
- 후 처리 작업 : 전달받은 스프링 객체를 조작하거나 다른 객체로 바꿔치기
- 등록 : 빈 후 처리기는 작업을 완료한 후 빈을 반환한다.
테스트를 통한 빈 후처리기 학습
public class BasicTest {
@Test
void basicConfig() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BasicConfig.class);
//A는 빈으로 등록된다.
A a = applicationContext.getBean("beanA", A.class);
a.helloA();
//B는 빈으로 등록되지 않는다.
Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() -> applicationContext.getBean(B.class));
}
@Slf4j
@Configuration
static class BasicConfig {
@Bean(name = "beanA")
public A a() {
return new A();
}
}
@Slf4j
static class A {
public void helloA() {
log.info("hello A");
}
}
@Slf4j
static class B {
public void helloB() {
log.info("hello B");
}
}
}
간단한 빈 등록 테스트 코드이다. BasicConfig
에서 A만 @Bean 등록했기 때문에 B를 호출하면 에러가 난다. 여기에 빈 후처리기를 등록해보자.
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
}
빈 후처리기를 이용하기 위해 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;
}
}
@Slf4j
@Configuration
static class BeanPostProcessorConfig {
@Bean(name = "beanA")
public A a() {
return new A();
}
@Bean
public AToBPostProcessor helloPostProcessor() {
return new AToBPostProcessor();
}
}
BasicTest에 AToBPostProcessor를 구현하고 BasicConfig 대신에 BeanPostProcessorConfig 를 생성해 AToBPostProcessor를 빈등록한다.
AToBPostProcessor
- 자체적으로 구현한 빈 후처리기이다. 파라미터로 넘어오는 bean이 A이면 B를 반환하고 그 외에는 원래 bean을 반환한다.
정리
- 빈 후처리기는 빈을 조작하고 변경할 수 있는 후킹 포인트이다.
- 일반적으로 컴포넌트 스캔의 대상이 되는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 모든 빈을 중간에 조작할 수 있다. 빈 객체를 프록시로 교체하는 것이 가능하다.
참고
@PostConstruct
- 스프링 빈 생성 이후에 빈을 초기화 하는 역할을 한다. 스프링은
CommonAnnotationBeanPostProcessor
라는 빈 후처리기를 자동으로 등록하는데 여기서@PostConstruct
애노테이션이 붙은 메서드를 호출한다.
이 내용은 인프런의 김영한님 강의 “스프링 핵심 원리 - 고급편”을 시청하고 정리한 글입니다.
댓글남기기