春:FactoryBean.getObject() の代わりに FactoryBean オブジェクトを取得する

StackOverflow https://stackoverflow.com/questions/1655140

質問

短い質問: 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="&amp;theFactoryBean" />

他のヒント

ファクトリ Bean 自体は、 & Spring config の構文:

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

とは対照的に:

<property name="createdBean" ref="theFactoryBean" />
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top