Spring : FactoryBean.getObject () 대신 FactoryBean 개체 얻기
-
11-09-2019 - |
문제
짧은 질문 : FactoryBean 인터페이스를 자극하는 클래스가있는 경우 FactoryBean.getObject () 대신 FactoryBean Object 자체에서 어떻게 얻을 수 있습니까?
긴 질문 : FactoryBean 인터페이스를 거의 사용하지 않는 3-Rd Party 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"라는 이름의 콩을 아크티 정의 ( "XYZ2"와 비교)는 변경되지 않지만 공장 특성 때문에 각 구성에 대한 코드를 복사해야합니다. "aname"이라는 이름의 Bean의 정의 항상 새로운 것입니다 (즉, 각 구성은 자체 ObjectContext 값을 갖습니다).
구성에 단일 공장 Bean ( "xyz2"를 제거하고 "aname"링크를 제거)을 단순화하고 싶습니다.
<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", "aname2")와 함께 공장 (예 : 예제의 xyz bean)을 접착한다고 가정합니다. Spring에 FactoryBean 객체를 요청할 때 ItemReader 값이 누락되어 해당 당시에 주입 할 수없는 FactoryBean.getObject ()에게 반환되기 때문에이 방법은 작동하지 않습니다.
Springsource가 제 사건을 예견하여 "훅"actorybean.getObject () 호출을 런타임에 필요한 모든 속성을 제공하기를 바랍니다.
나에게 조금 방해하는 또 다른 복잡성은 공장의 사슬입니다 (Factory1은 런타임에 "훅"해야하는 Factory2에서 물체를 얻습니다).
어떤 아이디어라도 감사하겠습니다.
해결책
그건 &
(Ampersand)는 Symbol이 아닌 Spring Framework 문서를 참조하십시오. FactoryBeans를 사용하여 인스턴스화 로직 사용자 정의
<property name="factoryBean" ref="&theFactoryBean" />
다른 팁
당신은 그것을 사용하여 공장 콩 자체를 얻을 수 있습니다 &
스프링 구성의 구문 :
<property name="factoryBean" ref="&theFactoryBean" />
반대로 :
<property name="createdBean" ref="theFactoryBean" />