2012-04-02 114 views
0

我試着在MethodInvokingFactoryBean上寫了一個測試程序,有兩個bean聲明如下。MethodInvokingFactoryBean-方法沒有被調用

<bean id="test2" class="test3"> 
</bean> 

<bean id="m2" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false" depends-on="test4"> 
    <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"></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> 

我通過獲取豆:

test3 obj3 = (test3) _context.getBean("test2"); 

對我來說這裏的用例就是, 在test2的執行方法execute之前,我應該能夠執行方法execute躺在豆「 test4「,因爲」test4「是我在」test2「中運行execute方法的一個參數。

而且,我需要做的一切都是lazy-init = true

我嘗試過上述方法,但test4中的方法「execute」在執行test2之前沒有被調用。

請幫我解決這個問題。

回答

2

executetest4不會被稱爲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中編碼的東西...

+0

謝謝。我將盡力做到這一點。在我的用例中,我需要將所有內容製作成lazy-init。此外,我嘗試運行帶有更改的應用程序,並且它引發了一個org.springframework.beans.factory.BeanCurrentlyInCreationException。我把它找出來,這是由於循環依賴。謹向我提供解決此問題的建議 – 2012-04-02 22:02:45

相關問題