web-dev-qa-db-ja.com

春にBean構成をオーバーライドする

2つのモジュールがあるとしましょう。 1つはコアで、もう1つはコアに依存する実装モジュールです。 Coreは、その依存する実装モジュールwarのjarファイルです。

コアには、次のように定義されたBeanがあります

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

そして、そのクラスには次のようなメソッドがあります

public class X{

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

}

このメソッドは、いくつかのコアクラスから呼び出されています。次に、コアに依存する実装に従って、XのdoSomeJob()メソッドのロジックを変更する必要があります。だから、私はこのようなクラスを作成します

public class ExtX extends X{

  @override
  public void doSomeJob(){
    // changed logic
  }

}

このような別のアプリケーションコンテキストxmlファイルで同じIDのBeanを定義しました。

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

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

しかし、コアロジックでは、コアBeanインスタンスのみ(つまり、Xインスタンス)を取得しており、ExtXは取得していません。そのBean定義をオーバーライドして、システムに新しい拡張Bean定義の使用を開始させるにはどうすればよいですか?

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

9
Pokuri

Bean定義をオーバーライドする1つの方法は、指定したものです。同じIDで複数回定義し、同じIDで最後のBean定義が有効になります。したがって、ExtXが最後にロードされたものであることを確認すると、正常に機能するはずです。これを確認するには、classpath:springfolderと言ってロードする代わりに、warファイルでこれを実行できます。コア構成をwarのSpring構成ファイルに明示的にインポートしてから、次の方法でBeanをオーバーライドします。

<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定義をロードし、orderプロパティを期待してソートして使用できます。そのようにしていますが、まだまだ多くの作業があります。

2番目のアプローチをここで説明します: 子コンテキストの親コンテキストで定義されたBeanをオーバーライドする

13
Biju Kunjummen