7

我需要能够为在编译时可能或未在类路径中定义的类添加新的 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 注释的另一个 bean 执行此操作时(它甚至可能是另一个动态组件):

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

它抛出一个 NoSuchBeanDefinitionException

请帮我!!我环顾四周并没有找到任何有用的信息,或者也许我有,但我无法在这么短的时间内测试我在网络上找到的所有内容,而且 spring 文档似乎只适用于正常情况和 xml 配置,而不是对于我正在尝试做的这些疯狂的事情,而不是用于编程配置。

4

1 回答 1

3

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

我认为您追求的是工厂模式。在 Spring 中,您可以通过实现FactoryBean. 在这里阅读更多:

于 2012-09-06T07:27:20.357 回答