我需要能够为在编译时可能或未在类路径中定义的类添加新的 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 配置,而不是对于我正在尝试做的这些疯狂的事情,而不是用于编程配置。