빈 후처리기

업데이트:

스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하기 위해 사용한다.

빈 후처리기 기능

  • 객체를 조작하거나, 완전히 다른 객체로 바꿔치기 하는 것도 가능.

    스크린샷 2022-01-04 오후 9.31.33.png

    1. 생성 : 스프링 빈 대상이 되는 객체를 생성(@Bean, 컴포넌트 스캔 등)
    2. 전달 : 생성된 객체를 빈 저장소에 등록하기 전에 후처리기로 전달
    3. 후 처리 작업 : 전달받은 스프링 객체를 조작하거나 다른 객체로 바꿔치기
    4. 등록 : 빈 후 처리기는 작업을 완료한 후 빈을 반환한다.

테스트를 통한 빈 후처리기 학습

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애노테이션이 붙은 메서드를 호출한다.

이 내용은 인프런의 김영한님 강의 “스프링 핵심 원리 - 고급편”을 시청하고 정리한 글입니다.

태그:

업데이트:

댓글남기기