2013-07-19 32 views
0

如果beans是通過XML配置的,那麼它的構造函數的輸入參數總是相同的,所以即使我將範圍聲明爲原型,類實例中的成員對於所有對象都是相同的?那麼,它是怎樣的原型?有人可以幫我理解Spring如何用來創建原型實例嗎?

舉個例子,如果我有一個類,它的構造函數取一個整數參數:

A(int i){} 

如果我通過XML豆配置,不會參數i的價值被硬編碼的呢?或者是否有一種方法可以在每次需要實例化類時將不同的值傳遞給i

+0

那麼什麼是使用具有原型實例? – nishant

+1

當然有。只需將構造函數參數連接到['FactoryBean'](http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/beans/factory/FactoryBean.html)。不確定註解是什麼,我在離開Javaland之前變成了一件事。 – millimoose

回答

1

您可以直接使用getBean時提供值。要獲得更加優雅的解決方案,請在春季文檔中查找「方法注入」。

<bean id="beanA" class="A" scope="prototype"> 
     <constructor-arg index="0" type="java.lang.Integer" value="null"/> 
</bean> 

A bean = (A) applicationContext.getBean("beanA", new Object[]{someInteger}); 
1

所有的實例在創建後都是一樣的。但是如果它們是有狀態的,那麼在一些操作之後它們將不會相同。

當然,如果你的bean是無狀態的,我沒有看到任何優勢使它成爲一個原型。

關於你的最後一個問題,使用SpringEL,你可以調用一個方法,每次返回一個不同的值。這樣每個實例在創建之後都是不同的。

1

,只要你想在同一個類可以聲明爲許多原型:

<bean id="beanNegative" class="MyBean" scope="prototype"> 
     <constructor-arg index="0" type="java.lang.Integer" value="-1"/> 
</bean> 

<bean id="beanPositive" class="MyBean" scope="prototype"> 
     <constructor-arg index="0" type="java.lang.Integer" value="1"/> 
</bean> 

<bean id="beanNeutral" class="MyBean" scope="prototype"> 
     <constructor-arg index="0" type="java.lang.Integer" value="0"/> 
</bean> 

只有值= 「 - 1」,值= 「1」,值= 「0」和名稱原型發生了變化。當你有多於一個類的實例的時候,就不可能按類自動佈線:你將需要明確地指定你想注入到你的依賴bean中的哪個原型實例。

另外需要注意的是,原型與單例不同的地方在於,每次從Spring獲取bean時,它都是一個新實例,而單例將爲您的應用中的所有其他bean提供相同的實例。

最好的問候, Zied哈姆迪 - http://1vu.fr

相關問題