以编程方式向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您需要将BeanFactory
为BeanDefinitionRegistry
,这可能会失败)。
这是一个简单的代码:
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(..)方法。 在这里阅读教程