2013-05-08 6 views
0

Есть ли способ программно добавить beanPostProcessor в ClassPathXmlApplicationContext?Как я могу программно добавить beanPostProcessor в ClassPathXmlApplicationContext?

Я могу сделать это декларативно в xml, но, видимо, нет возможности добавить программно.

Мой процессор должен что-то делать, если мой боб является MyInterfaceAware, а затем setMyInterface (...).

Мне нужно сделать это в коде, потому что реализация MyInterface создается в коде, она недоступна при запуске XML.

Я использую Spring 3.1.2.RELEASE.

Спасибо,

... это то, что я делаю ...

public void setSpringBeanFactory(BeanFactory beanFactory) { 
    this.beanFactory = (ApplicationContext) beanFactory; 
    ((ClassPathXmlApplicationContext) beanFactory).getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { 

     public Object postProcessBeforeInitialization(Object bean, 
       String beanName) throws BeansException { 
      return bean; 
     } 

     public Object postProcessAfterInitialization(Object bean, 
       String beanName) throws BeansException { 
      if (bean instanceof RegistryAware) 
       ((RegistryAware) bean).setRegistry(ApplicationContextRegistryImpl.this); 
      return bean; 
     } 
    }); 
    ((ClassPathXmlApplicationContext)beanFactory).refresh(); 
} 

ответ

2

Попробуйте с context.getBeanFactory().addBeanPostProcessor(beanPostProcessor)

Edit

Вы можете использовать BeanFactoryPostProcessor также :

public class RegistryBeanPostprocessorConfigurer implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     beanFactory.addBeanPostProcessor(getRegistryBeanPostProcessor()); 
    } 
} 

context.addBeanFactoryPostProcessor(new RegistryBeanPostProcessorConfigurer()); 
context.refresh(); 
+0

Простой способ? Не работает! –

+0

Процессоры не вызываются. –

+1

Добавьте beanPostProcessor после обновления(). Внутренний BF воссоздается на каждом обновлении(). Если вам нужен BPP раньше, переопределите postProcessBeanFactory(), чтобы зарегистрировать его. (не забудьте позвонить супер) –