Java Spring4如何在运行时动态注册新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时都刷新应

我有一个spring应用程序在从Spring3.2升级到Spring4.2时遇到了一些问题

应用程序具有标准的基于XML的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之间切换,即可导致并修复该问题。