10

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>

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

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

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

4

1 に答える 1

14

Bean定義をオーバーライドする1つの方法は、指定したものです。同じIDで複数回定義し、同じIDで最後のBean定義が有効になります。したがって、これExtXが最後にロードされたものであることを確認すると、正常に機能するはずです。これを確認するには、「」と言ってロードする代わりに、warファイルでこれを実行できます。classpath:springfolderコア構成を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をオーバーライドする

于 2012-08-06T18:55:28.987 に答える