CDIではフィールドを直接利用してもよい

CDIではフィールドを直接参照してはいけない

をみるとタイトルからCDIではまったくpublicフィールド触ってはいけないように感じてしまう。
実際はそんなことはない。

依存スコープのBeanなら直接参照してよい。

依存スコープというのは注入先のスコープに合わせるということ。プロキシ等を通さずインスタンスが生成されてそのまま入る。Springでいうところのプロトタイプということで一番単純なDIともいえる。

そして依存スコープ以外でpublicフィールドを持っているCDI管理下のビーンを作成すると、デプロイ時にはねられる。

つまりあのきしださんの例はパッケージプライベートを利用したときのみチェックにも引っかからず予想しない動きが発生するわけだ。すべてを同一パッケージにおくとは考えにくいこと、publicフィールドだとデプロイすらできないことを考えるとはまるほうが珍しいと考えることができる。


そのほか、CDIを利用したアプリ開発時の利点として上記のようなデプロイ時のチェックがちゃんと動くことにある。

たとえばセッションスコープのビーンシリアライズインターフェースを実装しないとデプロイ時にはねられる。

そしてそのセッションスコープのビーンに依存スコープのビーンを注入している場合、その依存スコープのビーンシリアライズが必須であり、これも実装していない場合はねられる。

そして最初に書いたとおりリクエストやセッションスコープの場合、publicフィールドがある場合、デプロイそのものができない。


一方、EJBはStatefulであってもスコープを意識してシリアライズインターフェースを注入しなくてよい。EJBへの参照は依存スコープであるが、EJBそのもののインスタンス管理はServletコンテナからは切り離されていて、気にしなくてよいということ。