春:FactoryBean.getObject() の代わりに FactoryBean オブジェクトを取得する
-
11-09-2019 - |
質問
短い質問: 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>
残念ながら、それは私が期待するほど単純ではありません。工場で接着すると思います(つまり、例の XYZ Bean) と必要なオブジェクト (つまり、"aName"、"aName2") 実行時に。Spring に FactoryBean オブジェクトを要求すると、FactoryBean.getObject() が返されるため、このアプローチは機能しません。 itemReader 値が欠落しているため、その時点ではインスタンス化できません。
SpringSource が私のケースを予見して、実行時に必要なすべてのプロパティを提供するために FactoryBean.getObject() 呼び出しを何らかの方法で「フック」できることを願っています。
私を少し悩ませているもう 1 つの複雑さは、ファクトリのチェーンです (ファクトリ 1 は、実行時に「フック」する必要があるファクトリ 2 からオブジェクトを取得します)。
あらゆるアイデアを歓迎いたします。
解決
それは &
(アンパサンド)、アットマークではありません。Spring Framework のドキュメントを参照してください。 FactoryBeans を使用したインスタンス化ロジックのカスタマイズ
<property name="factoryBean" ref="&theFactoryBean" />
他のヒント
ファクトリ Bean 自体は、 &
Spring config の構文:
<property name="factoryBean" ref="&theFactoryBean" />
とは対照的に:
<property name="createdBean" ref="theFactoryBean" />