====== SpringFramework Bean ====== ===== Springframework Bean Life Cycle ===== * [[springframework:bean_lifecycle|Spring Framework Bean Lifecycle]] * [[http://blog.outsider.ne.kr/776|[Spring 레퍼런스] 4장 IoC 컨테이너 #8 4.8 컨테이너 확장점(Extension Points)]] ==== BeanPostProcessor ==== * [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html|BeanPostProcessor]] * Spring Bean의 생성 전후에 Bean에 대한 초기화 작업을 수행할 수 있다. * BeanPostProcessor는 빈(또는 객체) 인스턴스상에서 동작한다. 즉, 스프링 IoC 컨테이너는 빈 인스턴스를 인스턴스화한 다음에 BeanPostProcessor가 자신의 일을 수행한다. * [[http://www.tutorialspoint.com/spring/spring_bean_post_processors.htm|Spring Bean Post Processors]] ==== BeanFactoryPostProcessor ==== * [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanFactoryPostProcessor.html|BeanFactoryPostProcessor]] * Bean의 정의 자체를 바꿀 수 있다. ''BeanPostProcessor''보다 먼저 실행된다. * [[springframework:javaconfig|Springframework Java Config]] 사용시에는 static으로 등록해야한다. ===== Dynamic Bean Definition - 동적 Bean 생성 ===== * [[http://www.tutorialspoint.com/spring/spring_bean_definition.htm|Spring Bean Definition]] ==== 구현 ==== * [[http://docs.spring.io/autorepo/docs/spring-framework/current//javadoc-api/org/springframework/beans/factory/support/BeanDefinitionRegistryPostProcessor.html|BeanDefinitionRegistryPostProcessor]]를 구현한다. @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { RootBeanDefinition beanDefinition = new RootBeanDefinition(MyServiceImpl.class); //The service implementation serviceDefinition.setTargetType(MyService.class); //The service interface serviceDefinition.setRole(BeanDefinition.ROLE_APPLICATION); registry.registerBeanDefinition("myBeanName", beanDefinition ); } // 혹은 다음과 같은 스타일 @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { for (String customerKey : customerKeys) { String dataSourceName = "dataSource_" + customerKey; BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(JndiObjectFactoryBean.class); definitionBuilder.addPropertyValue("jndiName", "jdbc/" + dataSourceName); registry.registerBeanDefinition(dataSourceName, definitionBuilder.getBeanDefinition()); } } * [[http://docs.spring.io/autorepo/docs/spring-framework/current//javadoc-api/org/springframework/beans/factory/support/BeanDefinitionBuilder.html|BeanDefinitionBuilder]]를 사용해서 Bean을 선언할 수 있다. * ''postProcessBeanFactory''는 필요없을 경우 구현하지 않고 빈 메소드로 남겨둔다. ==== 설정에 등록 ==== * 해당 구현체 자체를 ''@Configuration''으로 지정하거나 그냥 ''@Bean''으로 생성하는 것은 작동하지 않는다. * [[http://docs.spring.io/autorepo/docs/spring-framework/current//javadoc-api/org/springframework/context/ApplicationContextInitializer.html|ApplicationContextInitializer]] 안에서 [[http://docs.spring.io/autorepo/docs/spring-framework/current//javadoc-api/org/springframework/context/ConfigurableApplicationContext.html#addBeanFactoryPostProcessor-org.springframework.beans.factory.config.BeanFactoryPostProcessor-|applicationContext.addBeanFactoryPostProcessor]]로 등록한다. ==== 참조 ==== * [[http://blog.jdriven.com/2015/04/spicy-spring-dynamically-create-your-own-beandefinition/|Spicy Spring : Dynamically create your own BeanDefinition]] * [[https://dzone.com/articles/how-create-your-own-dynamic|How to Create Your Own 'Dynamic' Bean Definitions in Spring]]