Java Spring4如何在运行时动态注册新bean而不刷新应用程序上下文?
我有一个spring应用程序在从Spring3.2升级到Spring4.2时遇到了一些问题 应用程序具有标准的基于XML的bean配置,可以加载到应用程序上下文中,但在运行时也使用Java Spring4如何在运行时动态注册新bean而不刷新应用程序上下文?,java,spring,spring-mvc,configuration,spring-4,Java,Spring,Spring Mvc,Configuration,Spring 4,我有一个spring应用程序在从Spring3.2升级到Spring4.2时遇到了一些问题 应用程序具有标准的基于XML的bean配置,可以加载到应用程序上下文中,但在运行时也使用GenericaApplicationContext来注册新的bean定义,这些定义是共享的JmsTemplates,这些定义将根据需要在应用程序上下文中声明和重用为bean 显然,这在Spring3中还可以,但在Spring4中却不行,我想知道如何在Spring4中复制这种行为,而不必每次注册一个新bean时都刷新应
GenericaApplicationContext
来注册新的bean定义,这些定义是共享的JmsTemplate
s,这些定义将根据需要在应用程序上下文中声明和重用为bean
显然,这在Spring3中还可以,但在Spring4中却不行,我想知道如何在Spring4中复制这种行为,而不必每次注册一个新bean时都刷新应用程序上下文,从而销毁我仍然需要的所有以前注册的bean
_____编辑:其他信息_____
该应用程序还使用传统的XML配置来指定许多bean
_____编辑:示例方法______
private void createAndRegisterJmsTemplateBeanDefinition(
final String connectionFactoryBeanName,
final String jmsDestinationBeanName, final String location,
final ConnectionFactory connectionFactory,
final javax.jms.Destination destination) {
final BeanDefinitionBuilder bDBuilder = BeanDefinitionBuilder
.rootBeanDefinition("org.springframework.jms.core.JmsTemplate");
if (connectionFactoryBeanName == null) {
bDBuilder.addPropertyValue("connectionFactory", connectionFactory);
} else {
bDBuilder.addPropertyValue("connectionFactory",
genericContext.getBean(connectionFactoryBeanName));
}
if (jmsDestinationBeanName == null) {
bDBuilder.addPropertyValue("defaultDestination", destination);
} else {
bDBuilder.addPropertyValue("defaultDestination",
genericContext.getBean(jmsDestinationBeanName));
}
genericContext.registerBeanDefinition(location,
bDBuilder.getBeanDefinition());
}
其中,此方法在其中实现ApplicationContextAware的类
implements ApplicationContextAware
而genericContext由以下内容创建:
genericContext = new GenericApplicationContext();
或
其中“上下文”是由以下内容设置的ApplicationContext:
public void setApplicationContext(final ApplicationContext applicationContext) {
this.context = applicationContext;
}
这是从ApplicationContextAware实现所需的方法
implements ApplicationContextAware
调用genericContext.getBean(bean)
时抛出的错误,而代码仍在注册bean
在注册新bean之后放置
genericContext.refresh()
,并不能解决问题,因为这会从应用程序上下文中删除仍然需要的所有其他bean。我希望这仍然有效,什么不再有效,以及如何注册(和/或检索)这些bean@M.Deinum请查看我上面的编辑。我可能缺少图片的一部分,但您何时注册这些bean?在应用程序启动期间,是否真的在应用程序运行期间?您需要在某个时候调用refresh
,因为这将基于注册的bean定义初始化上下文。@M.Deinum该应用程序还使用常规的XML配置来指定一些bean。我上面展示的代码中的应用程序还尝试在运行时注册一堆新bean。它试图在@runtime中连接的bean是一组JMS模板,这些模板包含JMS消息队列和主题的信息,它尝试连接为bean的模板是根据它在运行时尝试使用的特定队列和主题确定的。奇怪的是,在它运行Spring 3.2之前,没有一个.refresh()到处都有人打电话,一切正常。只有在更新之后才出现问题。只需将pom.xml中的spring版本在3.2和4.2之间切换,即可导致并修复该问题。