빈 후처리기 - 소개

@Bean 으로 직접 등록하거나 컴포넌트 스캔을 하면 스프링 빈을 등록하면 컨테이너에 등록된다.

빈이 컨테이너에 등록하기 전에 무언가 조작하고 싶다면 빈 후처리기를 사용하면 된다.

빈 후처리기(BeanPostProcessor)는 빈이 컨테이너에 등록하기 직전에 빈을 조작하기 위해 사용된다. → 빈 등록과정에서 빈을 hooking한다.

빈 후처리기의 기능

빈 객체 내부를 조작할 수도 있고, 심지어 객체를 다른 객체로 바꿔치기할 수도 있다..!

image.png

빈 등록 과정을 빈 후처리기와 함께 살펴보자.

  1. 생성: 빈 객체를 생성한다.
  2. 전달: 생성된 객체를 빈 저장소에 등록하기 전에 빈 후처리기에 전달한다.
  3. 후처리 작업: 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 다른 객체로 바꿔치기할 수 있다.
  4. 등록: 빈 후처리기는 할일을 하고 빈 반환함. 반환된 객체는 컨테이너에 반환함. (그게 원래 객체가 아닐지라도..! hook역할을 한다.)

image.png

빈 후처리기 - 예제 코드 1

빈 후처리기 사용하기 전에 일반적인 스프링 빈 등록과정을 살펴보자.

컨텍스트 생성하고… 등록하면 된다.

public class BasicTest {

    @Test
    void basicTest() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(BasicConfig.class);

        //A는 빈으로 등록된다.
        A a = ac.getBean("beanA", A.class);
        a.helloA();

        //B는 등록되지 않았다.
        Assertions.assertThrows(NoSuchBeanDefinitionException.class, ()-> ac.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");
        }
    }