본문 바로가기

SpringFramework Core - I. IoC 컨테이너/8. 컨테이너의 확장가능한 부분들

1.8.2. BeanFactoryPostProcessor로 설정 메타데이터 커스터마이징하기

우리가 다음으로 살펴볼 확장 가능한 부분은 org.springframework.beans.factory.config.BeanFactoryPostProcessor이다. 이 인터페이스의 의미는 BeanPostProcessor와 유사하지만 한 가지 다른 점이 있다. BeanFactoryPostProcessor는 bean 설정 메타데이터에서 작동하는 점이다. 즉, 스프링 IoC 컨테이너는 BeanFactoryPostProcessor 인스턴스들 외에 다른 bean들을 초기화하기 전에 BeanFactoryPostProcessor가 설정 메타데이터를 읽고 잠재적으로 그것을 바꿀 수 있도록 한다.

 

여러 개의 BeanFactoryPostProcessor 인스턴스를 설정할 수 있다. 그리고 order 프로퍼티를 세팅함으로써  BeanFactoryPostProcessor 인스턴스들의 실행 순서를 제어할 수 있다. 그러나 BeanFactoryPostProcessor가 Ordered 인터페이스를 구현했을 때만 이 프로퍼티를 세팅할 수 있다. 만약 BeanFactoryPostProcessor을 직접 작성한다면 Ordered 인터페이스를 구현하는 것을 고려하라. 자세한 내용은 BeanFactoryPostProcessor와 Ordered 인터페이스의 자바 문서를 참고하면 된다.

 

 

  실제 bean 인스턴스를 변경하고 싶다면(즉, 설정 메타데이터로부터 생성된 객체들) BeanPostProcessor를 사용할 필요가 있다. 기술적으로 BeanFactoryPostProcessor 안에서는 bean 인스턴스들과 함께 작업이 가능하지만, bean들이 조기에 인스턴스화 되어버린다. 이는 컨테이너의 일반적인 라이프사이클을 위반하는 것이다. 이는 bean의 후처리를 우회해버리는 등의 부작용들을 가져올 수 있다.

 

또한, BeanFactoryPostProcessor 인스턴스들은 컨테이너 별로 scope가 할당된다. 이는 오직 계층적 컨테이너를 사용할 때에만 관련이 있다. 만약 하나의 컨테이너에서 BeanFactoryPostProcessor를 정의한다면 해당 컨테이너 안에 있는 bean들에게만 적용될 것이다. 다른 컨테이너에 있는 bean 정의들은 BeanFactoryPostProcessor에 의해 후처리되지 않는다. 심지어 두 컨테이너가 같은 계층의 일부라고 해도 마찬가지다.

 

 

bean 팩토리 후처리자는 ApplicationContext 안에서 선언될 때는 컨테이너를 정의하는 설정 메타데이터를 변경하기 위해 자동적으로 실행된다. 스프링은 PropertyOverrideConfigurer와 PropertySourcesPlaceholderConfigurer와 같은 많은 수의 사전 정의된 bean 팩토리 후처리자를 가지고 있다. 커스텀한 BeanFactoryPostProcessor 역시 사용할 수 있다. 예를들면, 커스텀한 프로퍼티 에디터를 등록하기 위해 사용할 수 있다. 

 

ApplicationContext는 BeanFactoryPostProcessor 인터페이스를 구현한 bean을 자동적으로 찾아낸다. 컨테이너는 이 bean들을 적절한 시점에 bean 팩토리 후처리자들로 사용한다. 이 후처리자 bean들을 다른 bean들을 위해 배치할 수 있다. 

 

 

  BeanPostProcessor에서 그랬듯이, BeanFactoryPostProcessor들을 lazy 초기화하도록 설정하고 싶지 않을 것이다. 만약 다른 어떤 bean도 Bean(Factory)PostProcessor를 참조하지 않는다면, 후처리자는 인스턴스화되지 않을 것이다. 그래서 그것을 lazy 초기화하도록 표시한 것은 무시될 것이다. 그리고 <bean /> 요소에서 Bean(Factory)PostProcessor를 선언하면서 default-lazy-init 속성을 'true'로 설정했다하더라도 Bean(Factory)PostProcessor는 일찍 인스턴스화될 것이다.