복붙노트

[SPRING] Spring : FactoryBean.getObject () 대신 FactoryBean 객체 가져 오기

SPRING

Spring : FactoryBean.getObject () 대신 FactoryBean 객체 가져 오기

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

긴 질문 : 저는 FactoryBean 인터페이스를 거의 사용하지 않는 Spring 기반의 3 차 라이브러리를 사용해야합니다. 지금 당장은 항상 2 개의 bean을 설정해야합니다 :

<!-- 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"라는 이름의 bean 정의 ( "XYZ2"와 비교)는 결코 변하지 않을 것이지만 공장 특성 때문에 각 구성에 대한 코드를 복사해야합니다. 이름이 "aName"인 빈의 정의는 항상 새로운 것입니다 (즉, 각 구성에는 고유 한 objectContext 값이 있습니다).

구성을 단순화하고 싶습니다 ( "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 빈)를 붙이는 것으로 가정합니다. 이 접근법은 FactoryBean 객체를 Spring에 요청할 때 FactoryBean.getObject ()를 반환하기 때문에 접근하지 못합니다. FactoryBean.getObject ()는 itemReader 값이 없어서 인스턴스를 생성 할 수 없기 때문입니다.

SpringSource가 나의 케이스를 예견하기를 바란다. FactoryHean.getObject ()를 호출하여 런타임에 필요한 모든 속성을 제공 할 수있다.

나에게 약간의 방해가되는 또 다른 복잡성은 Factory 체인 (Factory1은 런타임에 "hook"해야하는 Factory2로부터 객체를 얻는다)이다.

어떤 아이디어라도 감사 할 것입니다.

해결법

  1. ==============================

    1.At- 심볼이 아닌 & (앰퍼샌드)입니다. Spring Framework 문서를 참조하십시오 : FactoryBeans를 사용한 인스턴스화 로직 커스터마이징

    At- 심볼이 아닌 & (앰퍼샌드)입니다. Spring Framework 문서를 참조하십시오 : FactoryBeans를 사용한 인스턴스화 로직 커스터마이징

    <property name="factoryBean" ref="&amp;theFactoryBean" />
    
  2. ==============================

    2.Spring 구성에서 & 구문을 사용하여 factory bean 자체를 얻을 수 있습니다.

    Spring 구성에서 & 구문을 사용하여 factory bean 자체를 얻을 수 있습니다.

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

    반대로 :

    <property name="createdBean" ref="theFactoryBean" />
    
  3. from https://stackoverflow.com/questions/1655140/spring-getting-factorybean-object-instead-of-factorybean-getobject by cc-by-sa and MIT license