我需要能够在Spring Web上下文中添加新的bean(在任何作用域中),这些类可能在编译时被定义,也可能没有。
例如,我可以动态创建一些类,然后为该类注册单例或会话bean。
我读了一些有关BeanFactoryPostProcessor的内容,但不确定它是否适用于Web上下文,如果我理解正确,它只能在实际加载bean实例之前工作,而不能在之后,我错了吗?
我还没有找到有关如何在AnnotationConfigWebApplicationContext中执行此操作的信息,在我的测试中,所有我动态创建的bean都没有注入到其他实例中,即使它们被注入了,我也只看到了注册Singleton bean的方法,而不是其他作用域的方法:
ctx.getBeanFactory().registerSingleton("dummy", dummy);
我发现了这个问题:Spring中的动态创建Bean,但是当我尝试像这样将任何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配置,而不适用于我正在尝试做的这些疯狂的事情,也不适用于编程式配置。