2

'scope=step'を使用して'MethodInvokingFactory'Beanを定義すると、Beanのタイプを判別できないというエラーが発生しました。'scope=step'を'lazy-init= true'に置き換えると、正常に機能しました。私の知る限り、1つの違いを除いて、両方がBeanの遅延バインディングに使用されます。これらの2つの方法の間に他の違いはありますか?また、私の使用法は正しいですか?

これについてのあなたの考えを教えてください。

4

3 に答える 3

4

低レベルの観点から質問に答えるには:

lazy-init="true"Bean は、コンテキストが作成されたときにインスタンス化されませんが、別の Bean などによって参照されたときに作成されます。@AravindAのコメントからも、これは明らかだと思います。

Scoped Bean はさまざまな方法で動作します。コンテキストが作成されると、この Bean は追加のプロキシ オブジェクト (デフォルトでは CGLIB によって作成される) にラップされ、それを参照する Bean に渡されます (このプロキシは、デフォルトでは共有などのシングルトンです)。したがって、実行時にプロキシでメソッドが呼び出されるたびに、Spring は呼び出しと交差し、ファクトリに Bean のインスタンスを返すように要求し、その Bean でメソッドを呼び出します。ファクトリは、HTTP リクエスト (「リクエスト」スコープ) または HTTP セッション (「セッション」スコープ) などで「実際の」Bean インスタンスを検索したり、必要に応じて新しいインスタンスを作成したりできます。遅延インスタンス化により、コンテキストが作成されたときに明らかに定義されていない HTTP 要求/セッションからの値など、「ランタイム」(スコープ) 値でスコープ付き Bean を初期化できます。特に「ステップ」-scoped Bean はスレッド ローカルにバインドされます (パーティショニングのためにステップが並行して実行されることに注意してください)。そのため、スコープ付き Bean は、メソッドを呼び出すときに参照解除されます。最後に、スコープ付き Bean が別の Bean に設定された直後に (たとえばセッターで) メソッドを呼び出すことにより、このエレガントな Spring の「イデオロギー」を簡単に破ることができます:)

于 2012-01-06T16:42:18.373 に答える
2
      One thing to understand about lazy-initialization is that even though a bean 
      definition may be marked up as being lazy-initialized, if the lazy-initialized     
      bean is the dependency of a singleton bean that is not lazy-initialized, when the
      ApplicationContext is eagerly pre-instantiating the singleton, it will have to 
      satisfy all of the singletons dependencies, one of which will be the 
      lazy-initialized bean!

      Using a scope of Step is required in order to use late binding since the bean 
      cannot actually be instantiated until the Step starts, which allows the   
      attributes to be found. Because it is not part of the Spring container by   
      default, the scope must be added explicitly, either by using the batch namespace 
      or by including a bean definition explicitly for the StepScope (but not both):

      <bean class="org.springframework.batch.core.scope.StepScope" />

詳細については、こちらこちらをお読みください

scope="step" は、遅延初期化とは何の関係もありません。これは、「ステップ」内のパラメーターのレイト バインディングに使用されます。

于 2012-01-06T07:26:56.453 に答える
1

ステップ スコープは、具体的にはジョブ/ステップ属性のレイト バインディング用であり、実際には Bean のレイト バインディング用ではありません。つまり、Spring Bean コンテキスト/ファクトリは、ステップ スコープの Bean を強化し、設定する属性を探します。

value="#{jobParameters[input.file.name]}
于 2012-01-06T10:23:29.017 に答える