要求を処理するメインスレッドから作成された別のスレッドで非同期的にリクエストまたはセッションスコープでBeanを使用するのは安全でしょうか?SpringでのリクエストとセッションBeanのライフサイクル
リクエストが完了したか、セッションが終了して子スレッドがまだアクティブであれば、どうなるでしょうか。春は豆を壊すか、豆がまだ使用中であることを認識していますか?
私は豆のスコープとライフサイクルを春に身近に感じています。私のノービスを許してください。
要求を処理するメインスレッドから作成された別のスレッドで非同期的にリクエストまたはセッションスコープでBeanを使用するのは安全でしょうか?SpringでのリクエストとセッションBeanのライフサイクル
リクエストが完了したか、セッションが終了して子スレッドがまだアクティブであれば、どうなるでしょうか。春は豆を壊すか、豆がまだ使用中であることを認識していますか?
私は豆のスコープとライフサイクルを春に身近に感じています。私のノービスを許してください。
短い答え:安全ではないため、非同期処理を行うために必要な情報をコピーしてください。
長い答え:Springはプロキシを使用してスコープ付きBeanをリクエストします。このプロキシはあなたのクラスに注入されます。このプロキシでメソッドを呼び出すたびに、Springは(ThreadLocal
メカニズムを使用して)現在の要求に対して有効な実際のBeanを検索し、呼び出しを正しいインスタンスに委譲します。
リクエストスレッドが終了すると、関連付けられた要求スコープBeanがクリアされます(同じリクエストが別のリクエストで次回使用されたときに干渉しないように)。それらは「破壊」されませんが、(注入されたプロキシを介して)間接参照のみがあるため、効果的にアクセスできず、ガベージコレクションが行われます。
リクエストが終了した後で、プロキシのメソッドの1つを呼び出しようとしたときに有効なリクエストがもうない場合、Springは例外をスローします。
丁寧な説明をありがとう! – rhino2rhonda