2012-08-06 8 views
8

2つのモジュールがあるとします。 1つはコアであり、もう1つはコア依存の実装モジュールです。 コアは、その依存実装モジュールの戦争のjarファイルです。私は春のBean構成のオーバーライド

<bean id="x" class="com.pokuri.X"> 
<property name="y" ref="y"/> 
<property name="z" ref="z"/> 
</bean> 

のようにBeanを定義していると

public class X{ 

    public void doSomeJob(){ 
    ....... 
    } 

} 

を次のようにそのクラスが、この方法は、いくつかのコアクラスから呼び出されるメソッドを持つコアで

。今私はコアの依存する実装のようにXのdoSomeJob()メソッドのロジックを変更する必要があります。そこで、このようなクラスを作成して、このようなクラスの別のアプリケーションコンテキストxmlファイルに同じidのBeanを定義しました。

<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

、我々はclasspath:springfolderとして値を指定するweb.xmlcontextConfigLocationコンテキストパラメータを使用してアプリケーションコンテキストを構築しています。

しかし、コアロジックでは、ExtXではなく、コアビーンインスタンスのみ(つまり、Xインスタンス)が取得されています。どのようにしてそのBean定義を上書きし、新しい拡張Bean定義を使用してシステムを起動させることができますか?

そして、異なるアプリケーションコンテキストファイル内の同じIDを使用して、最初に読み込まれたBean定義を、後で読み込まれたBean定義で上書きすると聞きました。 Bean定義にはpriority種類の属性があります。同じIDのBeanが見つかった場合に、ApplicationContextが優先度の高いものを優先度の低いものよりも優先させるようにします。

答えて

12

Bean定義を上書きする1つの方法は、同じIDで複数回定義し、同じIDを持つ最後のBean定義を有効にすることです。したがって、ExtXがロードされた最後のものであることを確認したら、それはうまくいくはずです。これを確実にするには、classpath:springfolderと言ってロードするのではなく、あなたのwarファイルでこれを行うことができます。その後、設定ファイルや豆をこのようにオーバーライドします。

<import resource="core-resource.xml"/> 
<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

これはあなたのオーバーライドされたBeanが有効になるものであることを保証します。

ここで使用できる優先順位/順序フィールドはありません。必要に応じて、Map<String,X>をパラメータとして指定して、すべてのBean定義をロードして、注文プロパティを使用して並べ替えて使用することができますそれはそうですが、それにはもっと多くの仕事があります。

第2のアプローチは、ここで説明されていますOverriding the bean defined in parent context in a child context

+0

はそれが動作します。もちろん、あなたのアプローチ – Pokuri

+0

をしようとします。しかし、ある定義を別の定義でカバーするのは良い習慣ですか?私はそれがハックの一種だと思う:/ –

関連する問題