2013-08-23 125 views
0

我有一個Spring框架相關的查詢。用運行時創建的實例替換已經創建的實例

你能幫我解決這個問題。我的要求是用編程的方式在運行時創建一個已經創建的單例實例。

我有豆中定義的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,並在運行時替換「配置」,並加載其他依賴於此(刷新類型)的bean。在我們的例子中,anotherBean應該在我重新註冊單例之後看到新創建的ServiceConfiguration實例。

請問您是否願意發佈解決方案,因爲我是這種彈簧要求的新手。我得到一個錯誤,如果我嘗試註冊Singleton,因爲它說這個bean不能被註冊爲已經存在。錯誤infact是正確的,但我需要這種能力的應用程序。

謝謝你的幫助。

+0

你想如何創建新實例?你用'新'嗎? – 2013-08-23 16:06:32

+0

其實我正在使用dropwizard框架。 Dropwizard框架爲我提供了這個對象。我將不得不注入春豆。感謝您的回覆 – praveenkm

+0

假設它是否通過新建立,請問我可以告訴我這可以做到嗎? – praveenkm

回答

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); 
+0

但是這不使用我的新實例來設置配置。我的意圖是創建ServiceConfiguration的實例爲:ServiceConfiguration sc = new ServiceConfiguration(); //在sc上做一些邏輯來設置一些屬性。然後在Spring上下文中將bean id「configuration」指向的ref替換爲sc對象實例 – praveenkm

+0

@vensai更新了我的答案,以顯示如何設置屬性(字符串和上下文中的另一個bean) – wedens

+0

嗨wdeens,非常感謝您的建議。你有沒有使用BeanDefinition替換現有實例的選項?類似於以下內容:context.registerSingleton(「configuration」,sc); context.refresth();我同意註冊將自從它已經定義以來發生錯誤。但任何API只是用我的實例替換現有的bean? – praveenkm