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

use*_*714 52 java spring web-applications dynamic

由于插件架构,我正在尝试以编程方式将bean添加到我的webapp中.我有一个通过@Component注释创建的Spring bean ,我正在实现该ApplicationContextAware接口.

我的覆盖功能如下所示:

@Override
public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {

    // this fails
    this.applicationContext = (GenericWebApplicationContext) applicationContext;
 }
Run Code Online (Sandbox Code Playgroud)

基本上,我无法弄清楚如何将bean添加到setApplicationContext的applicationContext对象.任何人都可以告诉我我是怎么做错的方式吗?

好的,这就是我最终得到的解决方案:

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

    bdr.registerBeanDefinition("<my id>", definition);
}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 41

在Spring 3.0中,您可以创建bean实现BeanDefinitionRegistryPostProcessor并通过添加新bean BeanDefinitionRegistry.

在以前的Spring版本中,你可以做同样的事情BeanFactoryPostProcessor(虽然你需要BeanFactory转换BeanDefinitionRegistry,可能会失败).

  • 谢谢.我想最困难的部分是知道要寻找什么. (7认同)
  • 请注意按照[JavaDoc](http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.html) :`BeanFactoryPostProcessor可以与bean定义交互并修改bean定义,但永远不会与bean实例交互.这样做可能会导致bean过早实例化,违反容器并导致意外的副作用.如果需要bean实例交互,请考虑实现BeanPostProcessor (3认同)

snd*_*yuk 40

这是一个简单的代码:

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean);
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明一下答案吗? (2认同)

Sea*_*oyd 9

为什么你需要它的类型GenericWebApplicationContext
我认为你可以使用任何ApplicationContext类型.

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

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

你可以使用其中任何一个来连接bean

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

要么

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

  • 当我这样做时,它不会将它们添加到 ApplicationContext (2认同)