-ThreadLocal

Hangmanのデモを、徐々にMaya風(まあ、私の思うところのユースケースなのですが)にしていこうと思ってます。が、やはりStrutsから使って面倒なことが細かく残ってます。特にリクエスト毎にオブジェクトの連鎖ルートとなるようなモノ(コンテキストとでも言っておきます)を引き渡すのが問題。WEBのフレームワークにて、ServletContextやServletRequestなどがメソッドの引数にて出現するのは、まあ普通に考えたらそうなるものです。Mayaは0.9.8においてサーブレットAPIを置き換えていますが、その置き換えたものがやはりServletRequestのあった位置に見ることができます。
しかしDI以後の最近(まあ、私にとってはS2以降ということ)はそのへんもうまく対応しています。いや、もしかしたら、ひがさんからなのかな?たとえばS2ContainerImplに以下のようなメンバがあります。

private ThreadLocal requests_ = new ThreadLocal();

そしてアクセッサ

public void setRequest(HttpServletRequest request) {
  requests_.set(request);
}
public HttpServletResponse getResponse() {
  return (HttpServletResponse) responses_.get();
}

有名パターンなのかもしれませんが、とりあえず私はここ以外は技術書でしか見たことがないです。ThreadLocalクラスを用いて、WEBリクエストの入り口でコンテキストオブジェクトを保持しておく。すると、シングルトンのコンテナからでも、スレッドセーフにアクセスできるという次第。ThreadLocalクラスのソフトウェア技術的な種は特別なものじゃないのですが、利用方法としてうまい仕組みだと思います。
Mayaで徹底してこのパターンを使おうかな、と京浜島で飛行機と海を眺めながら思いました。というか、いままでさっぱり思いつかなかっただけなのですが。