JSF 2.0はViewスコープなど通常のDIコンテナにないスコープがある。そのほか生存期間を自分で制御したカスタムスコープもできるようになっている。
これではDIコンテナに管理Beanそのものを生成してもらうことは大変だ。
JSF 2.0時代のDIコンテナとの連携方法はJSFの注入を使うのがいいかも。
JSF 1.2までは設定ファイルで記述する必要があり、非常に面倒だったために使われることはあまりなかったと思うが、2.0からはアノテーションで記述ができる。
たとえば定数を保持していてキーで取得するようなクラス(PropertiesHolder)があったとする。それを注入するコードは以下のようになる。
@ManagedBean public class HogeBean { @ManagedProperty("#{propertiesHolder}") PropertiesHolder props; public String getHello(){ return props.getText("hello"); } //アクセサメソッド省略 }
見てわかるとおりELで記述するということとELメソッドがあるので以下のようなことも可能(やるかどうかはともかく)だ。
@ManagedBean public class HogeBean { @ManagedProperty("#{propertiesHolder.getText('hello')}") String text; public String getHello(){ return text; } //アクセサメソッド省略 }
つまり、ViewとControllerはJSFに完全に任せてしまって、Model部分、Service以降をDIコンテナに任せてしまうのが一番いいみたい。この方法だと注入方法が統一されていることもあって、DIコンテナに依存しない。トランザクション境界もわかりやすくなるし。