사용자 도구

사이트 도구


springframework:bean

SpringFramework Bean

Springframework Bean Life Cycle

BeanPostProcessor

  • Spring Bean의 생성 전후에 Bean에 대한 초기화 작업을 수행할 수 있다.
  • BeanPostProcessor는 빈(또는 객체) 인스턴스상에서 동작한다. 즉, 스프링 IoC 컨테이너는 빈 인스턴스를 인스턴스화한 다음에 BeanPostProcessor가 자신의 일을 수행한다.

BeanFactoryPostProcessor

SmartLifeCycle

  • getPhase() 에서 Integer.MAX_VALUE를 리턴하면 제일 늦게 생성되고, 제일 먼저 파괴 된다. 이 최우선 파괴 시점에 다른 Bean의 파괴 타이밍을 조정해준다.
  • SmartLifeCycle 안에서 다른 Bean 을 destroy 하려면, 그냥 하면 안되고 BeanFactoryAware 인터페이스를 구현하여 DefaultSingletonBeanRegistry 를 주입받은뒤, DefaultSingletonBeanRegistry.destroySingleton(beanName)을 사용해야한다. 그래야 Bean destroy 후에 해당 빈을 ApplicationContext 에서 제거해주어 중복 destroy 를 막아준다.
  • 입력받는 역할을 하는것(MQ Listener 등)을 먼저 종료시켜줘야 더이상 입력이 없는 상태에서 Gracefull 한 종료가 가능해진다.

Dynamic Bean Definition - 동적 Bean 생성

구현

  • 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()); 
        }
    }
  • BeanDefinitionBuilder를 사용해서 Bean을 선언할 수 있다.
  • postProcessBeanFactory는 필요없을 경우 구현하지 않고 빈 메소드로 남겨둔다.

설정에 등록

참조

springframework/bean.txt · 마지막으로 수정됨: 2019/11/27 16:58 저자 kwon37xi