2

たとえば、別の Bean をプロパティとして参照する Bean を含む Bean 定義ファイルを含む春のプロジェクトがあります。

<bean id="aBean" class="org.test.class">
    <property class="org.test.A" autowire="byType"/>
</bean>

この Bean 定義ファイルは、org.test.A を拡張する Bean を含む場合と含まない場合がある他の Spring プロジェクトによってインポートされます。

私がやりたいのは、org.test.A の拡張機能の実装 (つまり org.test.B) が存在する場合、それをプロパティで参照したいということです。それ以外の場合は、単に org.test.A を参照します。

私はこの問題についていくつかの調査を行ってきましたが、答えに達していません。カスタム TypeFilter を作成しようとしましたが、クラスの既存のすべての Bean 定義をチェックして選択するのではなく、クラスを返す必要があるかどうかにかかわらず、true または false を返すことができるようです。

そのようなことは可能ですか?もしそうなら、どのようにそれを行うつもりですか?

アイデアは、相互に参照する Bean 定義の束を書き直す必要がないようにすることです (そして、ほとんどの場合、すべてのプロジェクトですべて同じになります) および参照される Bean の実装のみを記述します。

この問題に関するご意見をお待ちしております。

----- 更新 1 ------

@Primary を使用して試してみましたが、これまでのところ運がありません。エラーはありませんが、使用されているクラスは @Primary のものではありません。

メイン クラス org.test.A は別のクラス (org.test.Whatever) を拡張し、サーブレット コンテキストでは次のようになります。

<bean id="someID" class="org.someclass">
    <property name="realm" ref="testBean" />
</bean>

そして、org.test.A を拡張し、@Component と @Primary の両方を持つ別の org.test.B クラスを作成しましたが、うまくいきません。Spring はクラスをロードしているようですが、使用していないようです。

----- 更新 2 -----

わかりました、何が起こっているか知っていると思います。私が自動配線しているクラス (ソース コードを制御できない) には、2 つのセット メソッドがあり、1 つは単一のクラスを取り、もう 1 つはそのクラスのコレクションを受け取ります。Spring は、同じクラスの複数の Bean を見つけるため、単一のインスタンスを取るセットを自動配線するのではなく、コレクションを取るセットを自動配線する必要があると考えているようです。

クラスをインスタンス化しているコンテキストxmlで、どのメソッドを自動配線する必要があるかを指定するにはどうすればよいですか? プロパティで autowire 属性を使用できない理由がわかりません。自動配線する方法を選択するために春を残すBeanにのみ自動配線を設定できます。:S

4

3 に答える 3

6

@Primary注釈が役立つ場合があります。

複数の実装がある場合は、注釈が付けられた実装@Primaryが使用されます

于 2013-07-22T13:15:04.737 に答える
0

この Bean をインスタンス化するには、スプリング ファクトリ メソッドを使用する必要があります。または、この例のようにルックアップ メソッド インジェクションを使用します。

于 2013-07-22T13:15:18.943 に答える
0

SpEL を使用してこれを行う別の方法を次に示します。Bean ID testDataStrategy と realDataStrategy を持つ DataStrategy タイプの 2 つの実装があります。

Java プロジェクトのプロパティ ファイルでプロパティ「data.strategy」を設定することで、Bean を選択できます。

<bean id="myBeanId" class="com.some.path.MyBeanClass" >
    <property name="dataStrategy" value="#   {'${data.strategy}'.equalsIgnoreCase('TEST_DATA') ? testDataStrategy : realDataStrategy}" />
</bean>
于 2014-07-02T07:46:13.363 に答える