将动态bean添加到spring Web上下文

Fra*_*ana 7 java spring

我需要能够将新bean添加到spring web上下文(在任何范围内),以便在编译时可能会在类路径中定义这些类.

例如,我可以动态创建一些这样的类,然后为这个类注册一个单例或会话bean.

我读了一些关于BeanFactoryPostProcessor的内容,但不确定它是否适用于Web上下文,如果我理解正确它只能在实际加载bean实例之前工作,而不是之后,或者我错了?

我无法在AnnotationConfigWebApplicationContext中找到有关如何执行此操作的信息,至少在我的测试中,我创建的所有bean都没有注入到其他实例中,即使它们是我只看到注册Singleton的方法bean但不适用于其他范围:

ctx.getBeanFactory().registerSingleton("dummy", dummy);
Run Code Online (Sandbox Code Playgroud)

PD

我发现了这个问题:在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
Run Code Online (Sandbox Code Playgroud)

...当我从MyConfig.class中配置的另一个bean执行此操作或使用@Component注释时(它甚至可能是另一个动态组件):

@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2
Run Code Online (Sandbox Code Playgroud)

它会抛出NoSuchBeanDefinitionException

请帮我!!我一直在四处寻找并没有找到任何有用的信息,或者我可能但是我无法在如此短的时间内测试我在网上找到的所有东西而且弹簧文档似乎只对正常情况和xml配置非常好,而不是对于我正在尝试做的这些疯狂的事情而不是编程配置.

pap*_*pap 3

你所追求的事情无法实现,抱歉。自动装配发生在 Bean 最初创建时。在您的例子中,您希望在将 bean 添加到工厂之前对其进行连接,这当然是行不通的 - Spring 不进行时间旅行。

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