使用在运行时创建的实例替换spring中已创建的实例

时间:2013-08-23 16:02:22

标签: spring

我有一个与Spring框架相关的查询。

你能不能帮助我解决这个问题。我的要求是将已创建的单例实例替换为以编程方式在运行时创建的实例。

我在bean中定义了一个spring上下文,如下所示:

<bean name="configuration"   
   class="com.myapp.tests.ServiceConfiguration" />  

<bean name="anotherBean class="com.myapp.tests.AnotherBeanClass">
     <property ref="configuration"/>
</bean>

我正在使用

加载上下文
ApplicationContext ctx = ClassPathXMLApplicationContext("appConfig.xml");

我需要创建一个新的com.myapp.tests.ServiceConfiguration实例,并在运行时替换“configuration”并加载其他依赖于此的bean(刷新类型)。在我们的例子中,在重新注册单例之后,anotherBean应该看到新创建的ServiceConfiguration实例。

你能不能发布一个解决方案,因为我对这种弹簧要求不熟悉。如果我尝试注册单子,我会收到一个错误,因为它说这个bean不能被注册为已存在。 Error infact是正确的,但我需要这种应用程序的功能。

为你的帮助而感恩。

1 个答案:

答案 0 :(得分:1)

 AutowireCapableBeanFactory factory = ctx.getAutowireCapableBeanFactory();
 BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
 GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
 MutablePropertyValues values = new MutablePropertyValues();
 values.addPropertyValue("property1", "abc");
 values.addPropertyValue("property2", new RuntimeBeanReference("beanFromContext"));
 beanDefinition.setPropertyValues(values);
 beanDefinition.setBeanClass(ServiceConfiguration.class);
 beanDefinition.setAutowireCandidate(true);
 registry.registerBeanDefinition("configuration", beanDefinition);