将动态bean添加到spring Web上下文

时间:2012-09-06 05:45:21

标签: java spring

我需要能够将新bean添加到spring web上下文(在任何范围内),以便在编译时可能会在类路径中定义这些类。

例如,我可以动态创建一些这些类,然后为这个类注册一个单例或会话bean。

我读了一些关于BeanFactoryPostProcessor的内容,但不确定它是否适用于Web上下文,如果我理解正确它只能在实际加载bean实例之前工作,而不是之后,或者我错了?

我无法在AnnotationConfigWebApplicationContext中找到有关如何执行此操作的信息,至少在我的测试中,我创建的所有bean都没有注入到其他实例中,即使它们是我只看到方法注册Singleton bean但不能注册其他范围:

ctx.getBeanFactory().registerSingleton("dummy", dummy);

Pd积

我发现了这个问题:Dynamic creation of beans in Spring但是当我尝试将任何bean,bean定义或bean定义构建器添加到这样的web上下文时,bean不会被加载:

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setServletContext(servletContext);
ctx.refresh();
//
log.trace("Registering first test bean");
Test test = new Test();
test.setDummy("x1");
ctx.getBeanFactory().registerSingleton("myTestBean1", test);        

log.trace("Registering second test bean");
BeanDefinition testDef = new RootBeanDefinition(Test.class);        
testDef.setScope(BeanDefinition.SCOPE_SINGLETON);        
ctx.getBeanFactory().registerSingleton("myTestBean2", testDef);

Test dummy1 = (Test)ctx.getBean("myTestBean1");
Object dummy2 = ctx.getBean("myTestBean2");

log.trace("beans: 1: {}; 2: {}", dummy1, dummy2); //<--this works, but...
ctx.refresh();

ctx.register(MyConfig.class); //configuring other beans

...当我从MyConfig.class中配置的另一个bean执行此操作或使用@Component注释时(它甚至可能是另一个动态组件):

@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2

抛出NoSuchBeanDefinitionException

请帮帮我!!我一直在四处寻找并没有找到任何有用的信息,或者我可能但是我无法在如此短的时间内测试我在网上找到的所有东西而且弹簧文档似乎对于正常情况和xml配置似乎非常好,而不是对于我正在尝试做的这些疯狂的事情而不是编程配置。

1 个答案:

答案 0 :(得分:2)

你所追求的是无法完成的,抱歉。最初创建bean时会发生自动装配。在您的情况下,您希望在将bean添加到工厂之前连接它,这当然不起作用 - Spring不会进行时间旅行。

我认为你所追求的是工厂模式。在Spring中,您可以通过实现FactoryBean将bean的实例化推迟到您创建的工厂。在这里阅读更多内容: