0

スプリング注入サービスを行っています

 class A{
      List l = new ArrayList();

      public m1(){
           //do some additions in list 
      }

      public m2(){
           //do some new additions in list
      }
 }

のオブジェクトの作成はA春の手に委ねられているため、プログラムの動作は期待どおりではありません。(リストは常に空で利用できると予想していますが、何らかの有線の理由でメソッドによって初期化されていません)

Spring は常に のインスタンスを 1 つだけ作成するAので、リストlは増え続けます。アプリケーション コンテキストで Bean をシングルトンとして構成しました。

はいの場合、当然、関数内のリストを初期化する必要がありますm1&m2または呼び出し先は参照を通過する必要があります。私の場合、呼び出し先は struts2 アクションであり、シングルトンではないため、この問題を解決できますか?

または

Spring は、すべての呼び出しなどでメンバー変数を初期化するための構成のサポートを提供していますか?

より一般的には、パフォーマンスと効率のためにメンバー変数/ローカル変数を使用することについて、Spring によって注入されるサービスを記述する際のベスト プラクティスは何ですか。

4

3 に答える 3

2

以下に答えようとしています:Springは、呼び出しごとにメンバー変数を初期化するための構成のサポートを提供しますか?

デフォルトでは、Spring Bean はシングルトンです。一度だけ初期化し、同じオブジェクトを何度も使用します。

ただし、要求どおりに要件が変更された場合。Spring が提供するスコープ属性を理解する必要があります。

<bean id="id" class="com.test.TP" scope="prototype">
</bean>

詳細については、以下を参照してください。スコープの説明

  • シングルトン

    Spring IoC コンテナーごとに単一の Bean 定義を単一のオブジェクト インスタンスにスコープします。

  • プロトタイプ

    単一の Bean 定義を任意の数のオブジェクト インスタンスにスコープします。

  • リクエスト

    単一の Bean 定義を単一の HTTP 要求のライフサイクルにスコープします。つまり、すべての HTTP リクエストには、単一の Bean 定義の背後から作成された Bean の独自のインスタンスがあります。Web 対応の Spring ApplicationContext のコンテキストでのみ有効です。

  • セッション

    単一の Bean 定義を HTTP セッションのライフサイクルにスコープします。Web 対応の Spring ApplicationContext のコンテキストでのみ有効です。

  • グローバルセッション

    単一の Bean 定義をグローバル HTTP セッションのライフサイクルにスコープします。通常、ポートレット コンテキストで使用する場合にのみ有効です。Web 対応の Spring ApplicationContext のコンテキストでのみ有効です。

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

スレッドスコープなどのユーザー定義のスコープを持つことも可能です。

于 2012-04-12T11:23:26.160 に答える
0

質問を理解しているかどうかはわかりませんが、サンプルクラスは春でうまくいくはずです。構成ファイルでコンストラクター引数を渡さない限り、Spring はデフォルトのコンストラクターを呼び出します。id="..."Bean にがある限り、そのクラスのシングルトンが作成されます。次に、呼び出す最初のクラスは空のリストとしてa.m1()表示されます。l

発生している可能性があるのは、複数のインスタンスAが作成されていることです。Spring シングルトンと nonについては、こちらを参照してください。引用するには:

Bean は、シングルトンまたは非シングルトンの 2 つのモードのいずれかでデプロイされるように定義されています。(後者はプロトタイプとも呼ばれますが、この用語はあまり当てはまらないため大まかに使用されています)。Bean がシングルトンの場合、Bean の 1 つの共有インスタンスのみが管理され、その Bean 定義に一致する 1 つまたは複数の ID を持つ Bean に対するすべての要求により、その 1 つの特定の Bean インスタンスが返されます。

そのため、Spring 構成でidorが指定されていない場合は、複数のインスタンスが作成される可能性があります。nameA

Bean デプロイメントの非シングルトン、プロトタイプ モードでは、その特定の Bean に対する要求が行われるたびに、新しい Bean インスタンスが作成されます。これは、たとえば、各ユーザーが独立したユーザー オブジェクトなどを必要とする状況に最適です。

于 2012-04-10T12:47:00.763 に答える
0

次のように Bean を構成できます。

<bean id = "serviceBeanA" class = "somepkg.A" scope="prototype">
    <property name = "l">
        <value>
            <list>
                 <value>ABC</value>
                 .....
            </list>
        </value>
    </property>
</bean>
于 2012-04-10T11:05:45.240 に答える