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