4

春を使った初日からいつも質問があります。クラスに2つのパラメーターを必要とするコンストラクターがあり、これら2つのパラメーターが固定されていない場合、それらは異なるたびに入力要求に従って生成されますが、クラスのインスタンスを管理するためのSpringコンテナーが必要です。これをSpringで実現する方法?例えば

    Class A{
     A(int x,int y){//omit}
}

ただし、xとyは固定されていないため、プログラムでxとyを計算する必要があります。その後、以下のように、通常のJavaコードでAのインスタンスを作成できます。

    int x=calculate(request);
    int y=calculate(request);
    A a=new A(x,y);

しかし、SpringにクラスAのインスタンス作成を管理させる方法はありますか?

追加情報:Aが春に管理されている他のクラスに依存しているため、クラスAが必要な理由は春に管理されています。

4

6 に答える 6

7
  • これを行う最も簡単な方法は、使用することです。指定された引数をコンストラクターに渡す -scoped Bean をApplicationContext.getBean(String name, Object... args)作成できます。を使用する Bean で直接prototype使用することは明らかに良い考えではありません。ApplicationContextA

  • より洗練されたアプローチは、 の作成をAファクトリの背後に隠すことです。そのファクトリは、前のアプローチを内部的に使用するか、通常の方法 ( など) で Bean のインスタンスを取得してから、(コンストラクターを使用してパラメーターを渡す代わりにProvider<A>) 非初期化メソッドを呼び出してそのパラメーターを渡すことができます。public

  • さらに別のアプローチは、Spring が で作成されたオブジェクトを初期化できるようにする@Configurableロード時のウィービングnewを使用することです。ただし、ランタイム環境の追加構成が必要です。

于 2012-09-10T15:59:32.057 に答える
2

それらは異なるたびに入力要求に従って生成されますが、クラスのインスタンスを管理するにはスプリングコンテナが必要です。スプリングでこれを実現するにはどうすればよいですか?

あなたはそうしない。ユーザー入力に応じてインスタンス化する必要があるクラスは、Spring によって管理されることを意図していません。

Spring を使用して一部の Bean を管理しているからといって、すべての Bean/クラスを Spring で管理する必要があるわけではありません。

于 2012-09-10T15:50:17.570 に答える
1

prototypeSpring Bean をではなくとして定義する必要がありますsingleton。そうすれば、新しいリクエストごとに、Spring コンテキストが Bean の新しいインスタンスを作成します。

Java 構成では、次のようになります。

@Scope("prototype") @Bean public MyBean myBean() { ... }

xml で:

<bean id="myBean" class="whatever.MyBean" scope="prototype"> ...

HTTP セッションに関連付けることができるスコープもあります。見る:

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html

そして、他の人が指摘したように、Bean のファクトリ メソッドを定義する必要があります。

参照: Spring と実行時の factory-method へのパラメーターの受け渡し

于 2012-09-10T15:55:50.163 に答える
0

intこれはいくつかのインスタンスで置き換えることができると思いObjectます。これを実現する1つの方法は、SpringのFactoryBean機能を使用してBeanの初期化をカスタマイズすることです。

class AFactory implements o.s.b.f.FactoryBean {

  private SomeObject firstParam;
  private OtherObject secondParam;

  public Object getObject() {
    return new A(firstParam, secondParam);
  }

  public Class getObjectType() {
    return A.class;
  }

  public boolean isSingleton() {
    return false; 
    // i.e. every time #getObject() is called a new instance is created === prototype scope
  }

  public void setFirstParam(SomeObject firstParam){}
  public void setSecondParam(OtherObject secondParam){}

}

SomeObjectとが実際にの依存関係のファクトリであるOtherObject他のsである可能性がある場合、への呼び出しがあるたびに、必要な依存関係の新しいインスタンスを使用するの新しいインスタンスを実際に受け取ることに注意してください。FactorBeanAAFactory#getObject()A

于 2012-09-10T15:54:08.610 に答える
0

コンストラクターを次のように変更する必要があるかもしれません。

Class A{
 A(Request request){ this.x=calculate(request); ....}
}
于 2012-09-10T15:52:04.087 に答える
0

このメソッドを BeanFactory クラス (ApplicationContext によって拡張) で使用することができます。

Object getBean(String name, Object... args)throws BeansException;

あなたの場合: context.getBean("A", x, y);

ここで、「A」はクラス A の Bean 名です。

于 2012-09-10T15:55:17.500 に答える