2012-04-02 2 views
0

MethodInvokingFactoryBean에 테스트 프로그램을 작성하려고했습니다. 다음과 같이 선언 된 2 개의 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에서 Method를 실행하기 전에 호출되지 않습니다.

친절하게 해결하도록 도와주세요.

답변

2

executetest4은 m3이 lazy-init="true"으로 선언되므로 불려 가지 않을 것입니다. 다음 의존성 체인이다

  • 열망 콩 TEST2가
  • 열망 콩 TEST4는
  • 열망 콩 m2가 TEST2 및 TEST4에 따라 독립적 인 독립
  • 지연 콩 m3는 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> 

, 모든 게으른 - 초기화입니다. 이제 종속의 사슬은 다음과 같습니다

  • 게으른 콩 TEST4는
  • 게으른 콩 m3는
  • 게으른 콩 m2 TEST4 콩에 따라 달라집니다 는 콩 m3 TEST2 및 테스트 4에 따라
  • 는이
  • 게으른 콩 TEST2가 따라 독립적 bean m2에

그래서 bean2를 요청하면 m2, m3 및 test4에 대한 초기화가 트리거됩니다. test2와 m2 사이에 순환 종속성이 있으므로 예쁜 것은 아니지만 작동해야합니다.

어쨌든 설정이 복잡하고 단순화 할 수 없다면 스프링이 시작될 시점에 있다고 생각합니다. 이러한 종속성의 관리를 숨기는 단일 서비스를 Java로 작성하여 모든 XML을 제거하고 대신 간단하고 간단한 간단한 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 --> 

비록 :

<bean id="test2Factory" class="test2FactoryClass"> 
    <property name="test4"><bean class="test5"/></property> 
</bean> 

<bean id="test2" factory-bean="test2Factory" factory-method="getInstance"/> 

UPDATE이 더러워지고

, 당신은 순환 성을 깰 일부 인공 빈을 선언하는 시도 할 수 : test2Factory 모든 추함이 숨 깁니다이 비슷한, 이 시점에서 나는 Java에서 코드를 작성합니다 ...

+0

고마워요. 나는 그것을 시도 할 것이다. 나의 유스 케이스에서는, 나는 lazy-init이되도록 모든 것을 필요로한다. 또한, 나는 변화를 가지고 어플리케이션을 실행하려고 시도하고, org.springframework.beans.factory.BeanCurrentlyInCreationException을 던진다. 나는 그것이 그것을 발견하기 위해 googled했다, 그것은 순환의 의존 때문에있다. 친절하게이 이슈를 해결하기 위해 나에게 제안을 제공해라. –

관련 문제