我需要能够将新bean添加到spring web上下文(在任何范围内),以便在编译时可能会在类路径中定义这些类.
例如,我可以动态创建一些这样的类,然后为这个类注册一个单例或会话bean.
我读了一些关于beanfactoryPostProcessor的内容,但不确定它是否适用于Web上下文,如果我理解正确它只能在实际加载bean实例之前工作,而不是之后,或者我错了?
我无法在AnnotationConfigWebApplicationContext中找到有关如何执行此操作的信息,至少在我的测试中,我创建的所有bean都没有注入到其他实例中,即使它们是我只看到注册Singleton的方法bean但不适用于其他范围:
ctx.getbeanfactory().registerSingleton("dummy",dummy);
P.D.
我发现了这个问题: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配置非常好,而不是对于我正在尝试做的这些疯狂的事情而不是编程配置.
我认为你所追求的是工厂模式.在Spring中,您可以通过实现FactoryBean
将bean的实例化推迟到您创建的工厂.在此处阅读更多内容:
> http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-extension-factorybean
> http://blog.springsource.org/2011/08/09/whats-a-factorybean/