2009-10-31 16 views
12

短い質問:私は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からオブジェクトを取得して実行時にフックする必要があります)。

アイデアをお寄せいただきありがとうございます。

答えて

20

それは&(アンパサンド)、いないで、シンボルですSpring Frameworkのドキュメントを参照してください。Customizing instantiation logic using FactoryBeans

<property name="factoryBean" ref="&amp;theFactoryBean" /> 
+0

そうです。おっとっと! –

+1

本当に確認しましたか?私はこの方法を試してみましたが、次のような例外が発生して失敗します。 原因:org.xml.sax.SAXParseException:エンティティ "theFactoryBean"への参照が ';'デリミタ。 – wax

+0

@wax:ありがとうございます。もちろん、あなたは正しいです、XMLは適切にエスケープされなければなりません。私はそれを修正しました – mhaller

2

あなたは春のconfigに&の構文を使用して工場出荷時の豆そのものを取得することができます。とは対照的に、

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

を:

<property name="createdBean" ref="theFactoryBean" /> 
+0

この解決策をcked?それはあなたのために働くのですか? – wax

+0

あなたの説明どおりに動作しません。正解は以下の通りです。 – wax

関連する問題