短い質問:私はFactoryBeanインターフェイスを実装したクラスを持っていますが、FactoryBean.getObject()ではなくFactoryBeanオブジェクト自体からどうやって取得できますか?Spring:FactoryBean.getObject()の代わりにFactoryBeanオブジェクトを取得する
長い質問: FactoryBeanインターフェイスをほとんど使用していない第三者Springベースのライブラリを使用する必要があります。今、私はいつも2つの豆を構成する必要があります:名「XYZ」と豆の
<!-- 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>
Actyuallyのdefintionは(「XYZ2」と比較して)変更されませんでしたが、理由は工場出荷時の性質の私には、それぞれのコードをコピーする必要があります構成。 名前が "aName"のBeanの定義は常に新しくなります(つまり、各構成には独自のobjectContext値があります)。私は設定を簡素化したいと思います
は(「XYZ2」を削除し、プール「aName」へのリンクを取り除く)単一工場Beanを持っている:
<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)を接着するとします。 FactoryBeanオブジェクトに対してSpringに尋ねると、itemReader値が見つからないため、その時点でインスタンス化できないFactoryBean.getObject()が返されるため、このアプローチは機能しません。
私は、SpringSourceが私の場合を予期することを願っています。実行時に必要なすべてのプロパティを提供するために、FactoryBean.getObject()コールをsomehome「フック」することができます。
もう少し複雑なことは、工場のチェーンです(Factory1はFactory2からオブジェクトを取得して実行時にフックする必要があります)。
アイデアをお寄せいただきありがとうございます。
そうです。おっとっと! –
本当に確認しましたか?私はこの方法を試してみましたが、次のような例外が発生して失敗します。 原因:org.xml.sax.SAXParseException:エンティティ "theFactoryBean"への参照が ';'デリミタ。 – wax
@wax:ありがとうございます。もちろん、あなたは正しいです、XMLは適切にエスケープされなければなりません。私はそれを修正しました – mhaller