以编程方式向Spring Web App上下文添加Bean

由于插件体系结构,我试图以编程方式向我的webapp添加一个bean。 我有一个通过@Component注释创build的Spring bean,我正在实现ApplicationContextAware接口。

我的覆盖function如下所示:

 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // this fails this.applicationContext = (GenericWebApplicationContext) applicationContext; } 

基本上,我不知道如何添加一个bean给setApplicationContext的applicationContext对象。 任何人都可以告诉我,我怎么这样做是错误的?

好的,这就是我最终解决的问题:

 @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) throws BeansException { BeanDefinition definition = new RootBeanDefinition( <My Class>.class); bdr.registerBeanDefinition("<my id>", definition); } 

在Spring 3.0中,您可以使Bean实现BeanDefinitionRegistryPostProcessor并通过BeanDefinitionRegistry添加新的Bean。

在以前的Spring版本中,您可以在BeanFactoryPostProcessor执行相同的操作(尽pipe您需要将BeanFactoryBeanDefinitionRegistry ,这可能会失败)。

这是一个简单的代码:

 ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 

为什么你需要它是typesGenericWebApplicationContext
我想你可以使用任何的ApplicationContexttypes。

通常你会使用init方法(除了你的setter方法):

 @PostConstruct public void init(){ AutowireCapableBeanFactory bf = this.applicationContext .getAutowireCapableBeanFactory(); // wire stuff here } 

而且你也可以使用wire beans

AutowireCapableBeanFactory.autowire(Class, int mode, boolean dependencyInject)

要么

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

检出JavaDoc中的registerXXX(..)方法。 在这里阅读教程