2009-10-31 6 views
12

짧은 질문 : FactoryBean 인터페이스를 구현 한 클래스가 있다면 FactoryBean.getObject() 대신 FactoryBean 객체 자체에서 어떻게 얻을 수 있습니까?Spring : FactoryBean.getObject() 대신 FactoryBean 객체 얻기

긴 질문 : FactoryBean 인터페이스를 거의 사용하지 않는 제 3 자 Spring 기반 라이브러리를 사용해야합니다. 지금은 항상 2 콩을 구성해야합니다

<!-- Case 1--> 
<bean id="XYZ" class="FactoryBean1" scope="prototype"> 
    <property name="steps"> 
     <bean class="FactoryBean2"> 
      <property name="itemReader" ref="aName"/> 
     </bean> 
    </property> 
</bean> 

<bean id="aName" class="com.package.ClassName1" scope="prototype"> 
    <property name="objectContext"> 
     <bean class="com.package.ABC"/> 
    </property> 
</bean> 

<!-- Case 2--> 
<bean id="XYZ2" class="FactoryBean1" scope="prototype"> 
    <property name="steps"> 
     <bean class="FactoryBean2"> 
      <property name="itemReader" ref="aName2"/> 
     </bean> 
    </property> 
</bean> 

<bean id="aName2" class="com.package.ClassName1" scope="prototype"> 
    <property name="objectContext"> 
     <bean class="com.package.QWE"/> 
    </property> 
</bean> 
이름 "XYZ"("가나다"와 비교)와 콩의

Actyually의 (고화질)이 변경되지 않습니다 결코 하지만 때문에 공장 자연의 I는 각각의 코드를 복사해야합니다 구성. 이름이 "aName"인 빈의 정의는 항상 새로운 것입니다 (즉, 각 구성에는 고유 한 objectContext 값이 있습니다).

<bean id="XYZ" class="FactoryBean1" scope="prototype"> 
    <property name="steps"> 
     <bean class="FactoryBean2"/> 
    </property> 
</bean> 

<bean id="aName" class="com.package.ClassName1" scope="prototype"> 
    <property name="objectContext"> 
     <bean class="com.package.ABC"/> 
    </property> 
</bean> 


<bean id="aName2" class="com.package.ClassName1" scope="prototype"> 
    <property name="objectContext"> 
     <bean class="com.package.QWE"/> 
    </property> 
</bean> 

불행하게도, 그것은 내가 기대만큼 간단하지 : 나는 구성을 단순화하고 싶은

는 (에 "aName"을 "가나다"를 제거하고 링크를 제거) 단일 공장 콩이있다. 런타임에 필요한 객체 (예 : "aName", "aName2")가있는 팩토리 (예 : XYZ 빈)를 붙이는 것으로 가정합니다. FactoryBean 객체에 대해 Spring에 요청하면 FactoryBean.getObject()가 반환됩니다. 왜냐하면 itemReader 값이 없기 때문에 Instanciate가 불가능하기 때문입니다.

나는 SpringSource가 내 경우를 예기하기를 바란다. 런타임에 필요한 모든 속성을 제공하기 위해 factoryBean.getObject() 호출을 "hook"할 수 있기를 바랍니다.

조금 복잡해 보이는 또 다른 복잡성은 Factory 체인입니다. Factory1은 Factory2에서 객체를 가져 와서 런타임에 "hook"해야합니다.

어떤 아이디어라도 감사하겠습니다.

답변

20

는 그것은 & (앰퍼샌드)의 아닌에서 심볼 , 스프링 프레임 워크 문서 참조 : Customizing instantiation logic using FactoryBeans

<property name="factoryBean" ref="&amp;theFactoryBean" /> 
+0

그렇습니다. 죄송합니다. –

+1

정말 확인 했습니까? 이런 식으로 시도한 예외와 함께 실패합니다 : 발생 원인 : org.xml.sax.SAXParseException : 엔티티 "theFactoryBean"에 대한 참조가 ';'로 끝나야합니다. 구분 기호. – wax

+0

@ 왁스 : 감사합니다. 물론 옳습니다. XML을 올바르게 이스케이프 처리해야합니다. 나는 그것을 바로 잡았습니다 – mhaller

2

당신은 스프링 설정에서 & 구문을 사용하여 공장 콩 자체를 얻을 수 있습니다에 반대

<property name="factoryBean" ref="&theFactoryBean" /> 

을 :

<property name="createdBean" ref="theFactoryBean" /> 
+0

정말로 체 웠어? 이 솔루션을 cked? 너에게 효과가 있니? – wax

+0

설명대로 작동하지 않습니다. 정답은 아래에 있습니다. – wax

관련 문제