12

簡単な質問: FactoryBean インターフェースを実装するクラスがある場合、FactoryBean.getObject() の代わりに FactoryBean オブジェクト自体から取得するにはどうすればよいですか?

長い質問: FactoryBean インターフェイスをほとんど使用しないサードパーティの Spring ベースのライブラリを使用する必要があります。現在、常に 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」という名前の 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 が私の場合を予測して、実行時に必要なすべてのプロパティを提供するために FactoryBean.getObject() 呼び出しを「フック」できることを願っています。

私を少し邪魔するもう1つの複雑さは、Factoryのチェーンです(Factory1は、実行時に「フック」する必要があるFactory2からオブジェクトを取得します)。

どんなアイデアでも大歓迎です。

4

2 に答える 2

20

これ&はアットマークではなく(アンパサンド)です。SpringFrameworkのドキュメント:FactoryBeansを使用したインスタンス化ロジックのカスタマイズを参照してください。

<property name="factoryBean" ref="&amp;theFactoryBean" />
于 2009-11-01T01:42:48.063 に答える
2

&spring configの構文を使用して、ファクトリBean自体を取得できます。

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

とは対照的に:

<property name="createdBean" ref="theFactoryBean" />
于 2009-10-31T18:46:34.353 に答える