簡単な質問: 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からオブジェクトを取得します)。
どんなアイデアでも大歓迎です。