반응형

Spring - Bean Post Processors


(원문 위치 : http://www.tutorialspoint.com/spring/spring_bean_post_processors.htm )

BeanPostProcessor interface는 사용자의 초기화 로직, 의존관계 해결(dependency-resolution) 로직등을 제공하기 위해 사용자가 구현할 수 있는 callback을 정의한다. 또한 하나 또는 그 이상의 BeanPostProcessor 구현을 plug-in하여 Spring container가 bean을 인스턴트화, 설정, 그리고 초기화(instantiating, configuring, initializing)를 끝낸 후 사용자정의 로직을 구현할 수 있다.

다수의 BeanPostProcessor interface를 설정할 수 있고 Ordered interface를 구현하는 BeanPostProcessor가 제공하는 'order' property를 설정하여 BeanPostProssor의 순서를 정할 수 있다.

BeanPostProcessor는 bean (또는 객체) instance에서 작동한다. 이것은 Spring IoC container가 bean instance를 초기화하고 이후 BeanPostProcessor interface가 동작하는 것을 의미한다.

ApplicationContext는 자동으로 BeanPostProcessor가 구현된 bean을 감지하고 bean 생성시 container에 의해 적절하게 호출되도록 post-processor로써 bean을 등록한다. 

Example:

[003] HelloWorld Example을 참조하여 프로젝트 생성

- 기본적인 BeanPostProcessor를 구현하는 예제로 bean의 인스턴스화 이전과 이후에 bean의 이름을 출력한다. 인스턴스화 전/후에 실행되는 post processor 모두에 접근할 수 있기 때문에 더 복잡한 로직을 집어 넣을 수도 있다.

HelloWorld.java:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public void getMessage(){
      System.out.println("Your Message : " + message);
   }

   public void init(){
      System.out.println("Bean is going through init.");
   }

   public void destroy(){
      System.out.println("Bean will destroy now.");
   }
}

InitHelloWorld.java: 다른 예제와 차이가 나는 부분으로 BeanPostProcessor interface를 구현하고 있음.

package com.tutorialspoint;

import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;

public class InitHelloWorld implements BeanPostProcessor {
 
   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("BeforeInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("AfterInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }

}

MainApp.java: AbstractApplicationContext를 사용하고 있음(registerShutdownHook() 함수 때문)

package com.tutorialspoint;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {

      AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
      context.registerShutdownHook();
   }
}

Beans.xml: 이전과는 다르게 <bean>이 하나 더 추가되어 있다. 처음에 언급된 것과 같이 Spring IoC container는 자동으로 BeanPostProcessor를 감지하여 등록한다. 그래서 이 설정 metadata에서 'com.tutorialspoint.InitHelloWorld'가 BeanPostProcessor interface를 구현한 것을 자동으로 감지하고 등록하게 되어 실행시 동작되도록 하는 것이다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld"
       init-method="init" destroy-method="destroy">
       <property name="message" value="Hello World!"/>
   </bean>

   <bean class="com.tutorialspoint.InitHelloWorld" />

</beans>

실행 결과는 아래와 같다.

BeforeInitialization : helloWorld
Bean is going through init.
AfterInitialization : helloWorld
Your Message : Hello World!
Bean will destroy now.


...?? 다수의 BeanPostProcessor를 등록하고 실행 순서를 설정하는 건?... 이것 이후 테스트해봐야 겠다..


반응형

+ Recent posts