JSF 2.0とDIコンテナの連携

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コンテナに依存しない。トランザクション境界もわかりやすくなるし。