yojikのlog

yojikのブログです

bijection (JBoss Seam)

JBossSeamのソース勉強中。JBoss Seamにはinjectionを越えたbijectionという概念があるらしい。
ふつーのDIコンテナは、コンテナがコンポーネントを構築する時に依存性を注入する。だからステートフルなコンポーネントへのDIはいまいち。bjectionの場合は、以下の特徴によりステートフルなコンポへのDIを自在なタイミングで行う

コンテキスト依存

コンポーネントには自身のライフサイクルに合わせたスコープをアノテートすることが可能。いろんなスコープに対応して階層化されたコンテキストが、アノテーションの情報を元にコンポーネントにDIを仕掛ける。コンテキストというのは、WebSessionContext(HTTPセッション)とかWebRequestContextとか。
リクエスト情報からオブジェクト組み立てたりするのもDIの延長線上として実現してるのでは(わかりづらい表現)
追記
例えば@InをActionのインスタンス変数につけておくと、リクエストがオブジェクト(EntityBeanというかPOJO)にマッピングされてActionに注入される。DIと利用方法が統一されているのがミソ?

双方向

injectの逆が可能。つまりコンポーネントの情報をコンテキストに戻すことができる。@In と @Out アノテーションで実現する。コンポーネントもコンテキストもステートフルだから意味がある。例えばWebRequestContextとWebコントローラ役のコンポーネントの情報を連動させたり。
追記
例えば@OutをActionのインスタンス変数につけておくと、オブジェクトの情報がJSPからアクセスできるコンテキストにマッピングされる。

ダイナミック

ふつーのDIよりめっさダイナミック。コンポーネントの構築時だけではなく必要に応じて(リクエストが飛んできた時とかに)ダイナミックにDIを行う。

以上、勘違いあるかもしれません。管理する側に情報を戻すという発想は新鮮に感じました。
追記
コンポーネントの状態の情報(具体的にはインスタンス変数)を必要に応じてコンテナ側に預けたり、逆にイジェクトしてもらったりするイメージかなー。実質アノテーションつけるだけ。
機能面だけ見ると他のフレームワークでも同じことをやってたりするんだけど、レイヤ毎にアプローチはバラバラ。それらを統一した概念で整理しているところが素敵だと思う。