Spring

Spring Bean Post Processor

n.han 2017. 2. 27. 20:40

BeanPostProcessor interface는 개발자만의 고유한 초기화 로직을 제공할 수 있도록 구현할 수 있는 call back 메서드들을 정의합니다. 

예를 들어, Bean이 초기화 되기 전에 해야할 작업들 혹은 초기화 후에 해야할 작업들을 BeanPostProcessor를 통해서 정의할 수 있습니다.

BeanPostProcessor interface를 plug-in하여 Spring container가 bean의 인스턴스화, 설정, 초기화 작업이 끝난 후에 custom logic을 구현할 수 있습니다.


또한 여러개의 BeanPostProcessor interface들을 설정할 수 있으며, order 속성을 세팅함으로써 interface가 실행되는 순서를 지정할 수 있습니다.


BeanPostProcessor은 bean 인스턴스에서 작동하는데, 그 의미는 Spring IoC Container가 bean 인스턴스를 초기화해야지 BeanPostProcessor가 그들의 일을 한다는 것 입니다.


ApplicationContext는 자동적으로 BeanPostProcessor를 구현한 bean들을 감지하며, 이 bean들을 post_processors라고 등록하여서 bean이 만들어진 후에 container에 의해서 적정하게 호출될 수 있도록 합니다.




다음은 ApplicationContext 안에서 BeanPostProcessor를 사용하고, 작성하고 등록하는 지에 관한 예시입니다.


BeanPostprocessor를 구현하는 InitHelloWorld라는 class에서, bean 초기화 시 call back 메서드들을 구현한 것을 볼 수 있습니다.

모든 Bean의 초기화 전, 후에 호출이 되며, bean 객체를 접근할 수 있으므로 보다 복잡한 커스텀 로직을 구현할 수 있습니다.



이 BeanPostProcessor는 마찬가지로 Bean으로 취급되니, Beans.xml에 등록을 해주어야 합니다.




다음은 BeanPostProcessor를 테스트할 HelloWorld 클래스입니다.




다음은 예제 main 로직과 그 결과입니다. init() 메서드가 호출되기 전,후에 BeanPostProcessor에 의한 두 메서드들이 호출되는 것을 볼 수 있습니다.



결과에서 무엇인가 특이한 점을 발견하셨나요?

메인 메서드에서 SingletonTest 인스턴스를 만들지도 않았는데, 초기화 작업이 발생한 것을 볼 수 있습니다.

즉, scope가 singleton인 경우, Bean 인스턴스 생성 시점이 명시적으로 해당 Bean 클래스를 처음 getBean 메서드로 호출한 지점이 아니라는 것이죠.


singleton scope를 가지는 instance는 ApplicationContext에서 instance 작업이 발생하는 시점에서 생성되는 것 입니다. getBean 메서드는 그냥 그 인스턴스를 가리키는 주소를 리턴해줄 뿐이죠.


'Spring' 카테고리의 다른 글

Spring - MVC Framework  (0) 2017.03.29
Spring Bean Definition Inheritance  (0) 2017.03.03
init-method와 destroy-method 속성  (0) 2017.02.26
Spring Bean Scope  (0) 2017.02.24
Bean Definition  (0) 2017.02.24