3

Wインターフェイスを実装するクラスBがあります。W のメソッドのデフォルトの実装があります。クラス C および D は、Bean が Spring によってインスタンス化されるサービスを必要とするデフォルトの実装をオーバーライドします。文字列 a と b はユーザーから取得されるため、事前に B/C/D の Bean を作成する方法はありません。したがって、ユーザーパラメーターに基づいて新しいオブジェクトを作成するファクトリがあります (パラメーターに基づいて B/C/D を作成します)。C と D の内部からサービス Bean (aa/bb/cc/dd など) を使用できるクリーンな方法はありますか (サーバーの起動時にスプリング オートワイヤー、その時点で B/C/D のインスタンス化に必要なパラメーターは使用できません) または問題を解決するためのより良い方法はありますか?

 Class B implements W{
      String a;
      String b;
      B (String a, String b);

      w_method(){

      }
   }

    Class C extends B {
      @Autowired
      Service aa;

      @Autowired
      Service bb;

      @Autowired
      Service cc;

      @override
      w_method(){
      }
    }

Class D extends B {
  @Autowired
  Service dd;

  @override
  w_method(){
  }
}
4

2 に答える 2

8

次の 3 つの方法があります。

  • コンストラクターの引数がユーザーから来るという事実は、これらのオブジェクトが Spring によって作成できないという意味ではありません。

    それらをスコープの Spring Bean として宣言しprototype、ファクトリで次のことを行うことができます。

    public C createC(String a, String b) {
        return applicationContext.getBean("c", a, b);
    }
    

    この方法の欠点は、ファクトリが に依存していることApplicationContextです。

  • これらのクラスにアノテーションを付けて@Configurable、AspectJ ウィービングを有効にすることができます。この場合、Spring はこれらのクラスのオブジェクトを で作成しても設定しますnew7.8.1 AspectJ を使用して、Spring でドメイン オブジェクトに依存性を注入するを参照してください。

  • 次のように手動で自動配線をトリガーできます

    applicationContext.getAutowireCapableBeanFactory().autowireBean(...);
    

    このアプローチは、自動配線する必要があるオブジェクト (サーブレットなど) の作成を制御できない場合に役立ちます。

于 2012-04-25T08:58:08.593 に答える
6

最も簡単な方法は、を使用するのではなく、サービスをファクトリに接続し、B / C/Dオブジェクトを返す前にセッターを呼び出すことだと思います@Autowired

または、axtavtのコンストラクター引数メソッドを使用します。に依存することを避けたい場合は、ルックアップメソッドインジェクションApplicationContextを使用できますが、次のブログ投稿に従ってSpringにパッチを適用する必要があります:http://nurkiewicz.blogspot.co.uk/2010/08/creating-prototype-spring- Beans-on.html

于 2012-04-25T09:05:46.670 に答える