Spring 4如何以编程方式在运行时获取和注册新bean?

时间:2016-03-20 05:32:12

标签: java spring spring-mvc applicationcontext spring-4

我有一个应用程序,它通过运行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中可以做些什么来允许这种行为以及应用程序上下文的“热”刷新?

0 个答案:

没有答案