我需要能够将新 bean 添加到 spring web 上下文(在任何范围内),用于在编译时可能在类路径中定义也可能不定义的类。
例如,我可以动态创建一些此类,然后为此类注册一个单例或 session bean。
我阅读了一些关于 BeanFactoryPostProcessor 的内容,但不确定它是否适用于 Web 上下文,如果我理解正确的话,它只会在实际加载 bean 实例之前起作用,而不是在那之后,或者我错了吗?
我无法在 AnnotationConfigWebApplicationContext 中找到有关如何执行此操作的信息,至少在我的测试中,我动态创建的所有 bean 都没有注入(inject)到其他实例中,即使它们是我也只看到方法注册单例 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 中配置或用 @Component 注释的 bean 执行此操作时(它甚至可能是另一个动态组件):
@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2
它抛出一个 NoSuchBeanDefinitionException
请帮帮我!!我四处张望并没有找到任何有用的信息,或者也许我找到了但我无法在这么短的时间内测试我在网络上找到的所有内容而且 spring 文档似乎只适用于正常情况和 xml 配置,而不是对于我正在尝试做的这些疯狂的事情,而不是为了编程配置。
最佳答案
抱歉,您所追求的无法实现。最初创建 bean 时会发生 Autowiring 。在您的情况下,您希望在将 bean 添加到工厂之前连接它,这当然行不通 - Spring 不进行时间旅行。
我想你追求的是工厂模式。在 Spring 中,您可以通过实现 FactoryBean
将 bean 的实例化延迟到您创建的工厂。 .在这里阅读更多内容:
关于java - 将动态 bean 添加到 spring web 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12293652/