2

Spring のリクエスト スコープ Bean は、コンテナが HTTP リクエストごとに 1 つの Bean インスタンスを作成することを意味します。

RequestScopedBean Bean があるとしましょう:

@Component
public class RequestScopedBean {
  @PostConstruct
  void init() {
     System.out.println("Init method called for each incoming HTTP Request");
  }
}

public void doSomething() {}

構成 :

@Configuration
public class MyBeansConfig {
  @Bean
  @Scope(value="request", proxyMode=TARGET_CLASS)
  public RequestScopedBean requestScopedBean() {
     return new requestScopedBean();
  }         
}

私はRequestScopedBeanをSingleton Bean内で使用しています - そして、着信 HTTP リクエストごとに init() メソッドが呼び出されることを期待しています。そうではありません。init() メソッドは 1 回だけ呼び出されます。つまり、コンテナはRequestScopedBeanのインスタンスを 1 つだけ作成します。誰かが私に説明できますか:私が期待している動作が正しいかどうか、または構成の何が問題なのか.

4

1 に答える 1

3

RequestScopedBean の冗長構成を行いました。Spring マネージド Bean (@Component など) の場合、@Bean を使用して構成クラスで同じものを定義する必要はありません。クラスに @Component アノテーションを付けたままにしておくだけで、Spring がそれをスキャンし、必要に応じてインスタンス化します。また、その範囲はクラス レベルで提供できます。このような:

@Component
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
 @PostConstruct
 void init() {
  System.out.println("Init method called for each incoming HTTP Request");

}

それ以外の場合は、@Bean メソッドを定義して、任意のクラス (Spring 管理の Bean である必要はありません) をインスタンス化し、必要なパラメーターを設定して、インスタンスを返すことができます。この場合のスコープは、メソッド レベルで指定できます。このような:

@Configuration
public class MyBeansConfig {
  @Bean
  @Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
  public RequestScopedBean requestScopedBean() {
    //if needed set the required parameters
     return new RequestScopedBean();
  }         
}

あなたの場合、両方を実行しましたが、これは必須ではなく、おそらくそれが期待どおりに動作しない理由です。問題を解決するには、次のいずれかを実行します。

  1. RequestScopedBean クラスの @Component アノテーションを削除します。

また

  1. 上記のように @Scope アノテーションを RequestScopedBean に追加し、Configuration クラスから RequestScopeBean の @Bean メソッドを削除します。
于 2016-09-14T14:23:25.770 に答える