execute
test4
不會被稱爲m3被宣佈爲lazy-init="true"
。依賴關係的鏈如下:
- 急於豆TEST2是獨立
- 急於豆TEST4是獨立
- 急於豆平方米取決於TEST2和TEST4
- 懶惰豆立方米取決於TEST4
所以在啓動時,Spring會初始化test2,test4和m2。它不會做m3,因爲它很懶惰。然後,當你向上下文請求bean test2時,它看到test4已經完全初始化並返回它。
現在,你說的是你需要的一切都是lazy-init="true"
,但實際上你的大部分豆都很渴望。會不會讓所有事情都變得非常懶惰,並以這種方式改變它可以滿足您的要求
<bean id="test2" class="test3" lazy-init="true" depends-on="m2">
</bean>
<bean id="m2" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true" depends-on="m3">
<property name="targetObject"><ref local="test2"></ref></property>
<property name="targetMethod"><value>execute</value></property>
<property name="arguments">
<list>
<value>abc</value>
<ref local="test4"></ref>
</list>
</property>
</bean>
<bean id="test4" class="test5" lazy-init="true"></bean>
<bean id="m3"class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true">
<property name="targetObject"><ref local="test4"></ref></property>
<property name="targetMethod"><value>execute</value></property>
<property name="arguments">
<list>
<value>xyz</value>
</list>
</property>
</bean>
這樣,一切都是lazy-init,所以Spring不應該在啓動時默認進行任何初始化。現在,依賴關係鏈是:
- 懶豆腐TEST4獨立
- 懶豆腐立方米取決於豆TEST4
- 懶豆腐平方米取決於豆TEST2,M3和TEST4
- 懶豆腐test2的依賴on bean m2
所以當你請求bean test2時,會觸發m2,m3和test4的初始化。它並不漂亮,因爲test2和m2之間存在循環依賴關係,但它應該起作用。
無論如何,你的設置是相當複雜的,如果你不能簡化它,我認爲你正處在Spring開始迎頭趕上的地步。我建議你在Java中編寫一個單獨的服務來隱藏這些依賴關係的管理,這樣你就可以刪除所有這些XML,而只需要一個簡單而直接的bean聲明。一些與此類似,在test2Factory隱藏所有的醜陋:
<bean id="test2Factory" class="test2FactoryClass">
<property name="test4"><bean class="test5"/></property>
</bean>
<bean id="test2" factory-bean="test2Factory" factory-method="getInstance"/>
UPDATE
這是越來越亂,你可以嘗試宣告一些人工的bean打破圓:
<bean id="rawTest2" class="test3" lazy-init="true">
</bean>
<bean id="m2" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true" depends-on="m3">
<property name="targetObject"><ref local="rawTest2"></ref></property>
<property name="targetMethod"><value>execute</value></property>
<property name="arguments">
<list>
<value>abc</value>
<ref local="test4"></ref>
</list>
</property>
</bean>
<bean id="test2" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" lazy-init="true" depends-on="m2">
<property name="targetBeanName" value="rawTest2"/>
<property name="propertyPath" value=" "/><!-- One space inside quotes -->
</bean>
<!-- m3 and test4 stay the same as before -->
雖然在這一點上,我只是在Java中編碼的東西...
謝謝。我將盡力做到這一點。在我的用例中,我需要將所有內容製作成lazy-init。此外,我嘗試運行帶有更改的應用程序,並且它引發了一個org.springframework.beans.factory.BeanCurrentlyInCreationException。我把它找出來,這是由於循環依賴。謹向我提供解決此問題的建議 – 2012-04-02 22:02:45