2012-04-02 70 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