如果beans是通過XML配置的,那麼它的構造函數的輸入參數總是相同的,所以即使我將範圍聲明爲原型,類實例中的成員對於所有對象都是相同的?那麼,它是怎樣的原型?有人可以幫我理解Spring如何用來創建原型實例嗎?
舉個例子,如果我有一個類,它的構造函數取一個整數參數:
A(int i){}
如果我通過XML豆配置,不會參數i
的價值被硬編碼的呢?或者是否有一種方法可以在每次需要實例化類時將不同的值傳遞給i
?
如果beans是通過XML配置的,那麼它的構造函數的輸入參數總是相同的,所以即使我將範圍聲明爲原型,類實例中的成員對於所有對象都是相同的?那麼,它是怎樣的原型?有人可以幫我理解Spring如何用來創建原型實例嗎?
舉個例子,如果我有一個類,它的構造函數取一個整數參數:
A(int i){}
如果我通過XML豆配置,不會參數i
的價值被硬編碼的呢?或者是否有一種方法可以在每次需要實例化類時將不同的值傳遞給i
?
您可以直接使用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});
所有的實例在創建後都是一樣的。但是如果它們是有狀態的,那麼在一些操作之後它們將不會相同。
當然,如果你的bean是無狀態的,我沒有看到任何優勢使它成爲一個原型。
關於你的最後一個問題,使用SpringEL,你可以調用一個方法,每次返回一個不同的值。這樣每個實例在創建之後都是不同的。
,只要你想在同一個類可以聲明爲許多原型:
<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
那麼什麼是使用具有原型實例? – nishant
當然有。只需將構造函數參數連接到['FactoryBean'](http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/beans/factory/FactoryBean.html)。不確定註解是什麼,我在離開Javaland之前變成了一件事。 – millimoose