我有一个应用程序,它通过运行Spring 3.2的JMS发送消息,并升级到Spring 4.2。
在某些情况下,应用程序正在做的是在实用程序类中设置单个GenericApplicationContext,并在不先首先注册每个bean的情况下获取和注册bean。
示例:
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());
执行以下行时:
genericContext.getBean(jmsDestinationBeanName));
我得到一个例外:
org.springframework.context.support.GenericApplicationContext has not been refreshed yet
此问题仅在从spring-tx(以及所有其他弹簧)3.2升级到弹簧4.2后才开始发生。如果我将版本切换回来,问题就会消失。
当我尝试放置
时genericContext.refresh();
在上下文中任何bean注册之前或之后,它会抛出一个异常,说明不允许多次刷新尝试。
在Spring 4中可以做些什么来允许这种行为以及应用程序上下文的“热”刷新?