Springにおけるスコープ調整方法の事例集
Spring Framework で RequestScope をアレコレ上手いこと使うための実装例
Spring IntegrationのActivatorでRequest Scopeを使う
Spring Integration の message をトリガーに Service 層などを呼び出した場合は普通は RequestScope を使えない
HTTPリクエスト経由のAPI呼び出しした場合にはデフォルトで使える
バッチ処理をSpring Integrationを用いて実装していて, かつ Service 層に RequestScope のインスタンスをDIしていて, APIとバッチとで共通して Service 層を使いたいという状況になったとき, この問題に直面する
バックエンドを Spring + Java でこんな感じに構築しようとした場合に遭遇しそうykyki.icon
現に業務で遭遇しているykyki.icon
RequestScope のインスタンスの一例としては, リクエストがあった時刻を immutable に保持しておくクラスなど
そもそも共通部分に RequestScope を使うのが筋が悪いという話も考えられるykyki.icon
そうは言っても RequestScope は簡単に使い始めることができて使い方も直感的
適切なカスタムスコープを自作するのもひと手間
Q. どうやってこの問題を乗り越えるか?
A. 無理矢理 RequestScope を作る
UserGenerateBatchMessageHandler からバッチ処理を実行している
自作の BatchMessagingGateway アノテーションをこの MessageHandler に付けている
このアノテーションから BatchMessageChannelRequestAdvice を呼び出す
最初は Advice ではなく MethodInterceptor を使おうとしたが, その方法だと上手く動作しなかった (うろ覚え) ykyki.icon
この Advice から BatchServiceRequestContextListener クラスを経由して org.springframework.web.context.request.RequestContextListener を初期化する
その際にダミーの ServletRequestEvent を差し込む
バッチ処理完了時にこの Listener が破棄される
SpringのAsyncでRequest Scopeを使う
@Async アノテーションを付けてメソッドを実行した場合, デフォルトでは ReuqestScope はそのまま使うことはできない
ここに書いてあるように AsyncConfiguration を用意するだけでOK
ちなみに java.lang.IllegalStateException: No thread-bound request found: ~ というエラーメッセージは org.springframework.web.context.request.RequestContextHolder というクラスで定義されている様子
これより下層の実装では jakarta.faces.context.FacesContext を使っているらしく, コードが追えずわからん ykyki.icon
SpringでAutowireされるクラスの挙動を微調整する
既にプロジェクト内で数十カ所で Autowired されている RequestScope のクラスの処理をプロジェクト全体で横断的に微調整したいことがあった
TODO
SpringでCustom Scopeを使う
TODO
Reference