google guiceでごにょごにょ

去年の4月ぐらいにmixiに書いたネタなのでひょっとしたらもっと情報が出てるかも知れないけど当時はあまり情報が無かったネタ。この辺ができればいいなぁと思って調べたときの話。

  1. 定数のインジェクション
  2. MapとかListとかのインジェクション
  3. 宣言的トランザクション
  4. メッセージリソースからのメッセージの取得


1.はこんな感じでできそう。

 // こんな感じでバインドして
 bindConstant().annotatedWith(Names.named("なまえ"))
     .to("インジェクションされる値");

 // こんな感じでインジェクション
 @Inject
 @Named("なまえ")
 private String methodName;


2. はこんな感じっぽい。

 // こんな感じでバインドして
 bind(new TypeLiteral>>() {})
 		.annotatedWith(Names.named("dataMap"))
 		.toInstance(new HashMap>());

 // こんな感じでインジェクション
 @Inject
 @Named("dataMap")
 private Map> dataMap;


3.はちょいとめんどいけど、理論上はこんな感じでできそげ。早い話が、トランザクションコンテキストパターンとアノテーションAOPの組み合わせ。

  1. トランザクション境界となるメソッドに@Transactionalといったアノテーションをつける。
  2. AOPを利用して、アノテーションがついているメソッドを呼び出す前にデータソースなりなんなりを取得し、スレッドローカルに紐つける。
  3. アノテーションがついたメソッドを呼び出す。
  4. DAOではスレッドローカルに紐つけられたデータソースを使用する。
  5. アノテーションがついているメソッドの終了後に、AOPでコミットなりロールバックなりをしてスレッドローカルとデータソースの紐付けを消す。


ちなみに、現在はどうか知りませんが、上記のようなことをしてくれるアノテーションはデフォルトでは存在しません。自作する必要があります。


4. は・・・うーん・・・普通にResourceBundleとMessageFormatを組み合わせて自作するしかなさげ?


んで、以下感想。

  1. google guiceはDIに特化しすぎていて、実際にアプリケーション作ろうと思うとSpringとかと比べてかなり作り込みが多そうで結構大変そう。
    1. 比較的大きな案件だと大抵Struts + Spring + Hibernateとかの組み合わせで「俺フルスタックフレームワーク」を作ることになるかと思いますが、guiceベースの俺フルスタックフレームワークは作り込みがかなり多そう。
  2. アノテーションを使ったAOP設定とかかなり簡単だったけど、例えば、監査ログとかを入れたいときに、いちいちメソッドにアノテーション入れていくのもちょっと現実的では無いと思うのですが、とあるパターンを満たすメソッドに一括でAOP設定とかはできんのでしょうか?


結論的には、生でguiceを使うのはちょっと厳しげで、guiceをベースとしたフルスタックフレームワークとかが無いと厳しいなぁという感じがしないでも無いのですが、誰か作んないかな。


・・・この展開には何やらデジャブが・・・