dynamic하게 bean 을 생성하는 법은 두 가지 (BeanFactoryPostProcessor, BeanPostProcessor)를 활용한 방식이다. 


1. BeanFactoryPostProcessor

예제)
http://random-thoughts-vortex.blogspot.kr/2009/03/create-dynamically-spring-beans.html

API)
http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/beans/factory/config/BeanFactoryPostProcessor.html



2. BeanPostProcessor

예제)
http://www.springindepth.com/book/in-depth-ioc-bean-post-processors-and-beanFactory-post-processors.html

API)
http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html


참골, ConfigurableListableBeanFactory 는 SingletonBeanRegistry를 상속받았기 때문에 singleton bean을 container에 추가할 수 있다. 특이한 것은 BeanDefinition과 무관하게 임의의 이름으로 spring container에 추가할 수 있다는 큰 장점이 있다. 

http://srcrr.com/java/spring/3.1.0/reference/org/springframework/beans/factory/config/ConfigurableListableBeanFactory.html


아래 예제는 SimpleBean에 임의의 이름 xxxxxsimplebean으로 SimpleBean 을 Binding하였다. ConfigurableListableBeanFactory.registerSingleton() 메소드는 BeanDefinition과 상관없다. 따라서 ApplicationContext.removeBeanDefinition()을 호출하면, "org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xxxxxsimplebean' is defined"이 발생한다. 

* SimpleBean.java

public class SimpleBean {
    public void print() {
        System.
out.println("Simple Bean!");
    }
}


* 코드 


@Test
public void test() {
    StaticApplicationContext
applicationContext = new StaticApplicationContext();
    ConfigurableListableBeanFactory
beanFactory = applicationContext.getBeanFactory();
 
beanFactory.registerSingleton("xxxxxsimplebean", new SimpleBean());
  SimpleBean
bean = (SimpleBean)applicationContext.getBean("xxxxxsimplebean");
 
bean.print();
 

  SimpleBean bean1 = (SimpleBean) beanFactory.getSingleton("xxxxxsimplebean");

  bean1.print();

 
// applicationContext.removeBeanDefinition("xxxxxsimplebean"); // 에러
 
applicationContext.close();
}


* 결과 화면


Simple Bean!
Simple Bean!



Posted by '김용환'
,