스프링에서 Bean으로 등록된 객체에 특정 Bean에 대한 의존성을 주입할 때, 스프링에서 제공(@Autowired, @Value)하는 혹은 자바 제공(@Inject, @Resource)하는 애노테이션들이 어떤 원리로 주입이 되는 것?에 대한 궁금증이 생겼다. 그것은 바로 BeanPostProcessor 이라는 클래스에 해답을 얻을 수 있다.
BeanPostProcessor는 스프링 컨테이너 안에서 만든 bean에 전/후처리 작업을 할 수 있도록 만든 인터페이스이다. 여러 구현체들을 보면 AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor 등등 다양한 BeanPostProcessor들이 존재하며, 서드파티 라이브러리 중에서도 스프링 위에서 동작할 수 있도록 BeanPostProcessor를 추가로 제공하기도 한다. (MeterRegistryBeanPostProcessor, ArmeriaBeanPostProcessor, …)
1 2 3 4 5 6
publicinterfaceBeanPostProcessor{ // 빈 생성 이전에 실행되는 메소드 Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException; // 빈 생성 이후에 실행되는 메소드 Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException; }
인터페이스는 굉장히 깔끔하고 단순하다.
그렇다면 BeanPostProcessor의 생성시점은 언제일까? 코드를 들여다 보면 다음과 같다.