NetBeans6.0のVisual Web JSFでSpring2.5を使ってみる その6

今度はJavaのコード、つまり管理されたページビーンからSpringのコードを呼び出したいと思う。

基本的に2つの方法がある。ひとつはアプリケーションコンテキストというSpringのコンポーネントを管理しているところから直接取得する方法。もうひとつはJSFの管理されたビーンにセッターを使ってセットしてあげる方法だ。

一つ目は一番基本的なものだが、これをいちいち呼び出していたらSpringを扱って楽をするメリットが減る。EJB3ならばアノテーションをつけるだけで自動的にEJB参照となって手軽に扱えるのに。

2つめはJSFのELを解釈させることによってSpringで管理されるオブジェクトを取得する。という部分が割り込んでくれます。素直にアクセスが出来てSpringのサンプルコードとしてよく使われることからも、これがJSFからSpringを呼び出すための基本形。だが、いちいちひとつのページごとにセットしてあげるべきオブジェクトを定義してあげなければならない。Spring自体の管理だけでも面倒になりがちなのにさらにfaces-config.xmlで定義、さらにそのオブジェクトを使えるようにセッターを管理されたページビーンに追加。

はっきりいって面倒くさすぎ。Javaといえばシンプルで軽いプログラムが売りなので(ここ数年はなんか変だったけど)こんなの認められない。

これは管理されたビーンはあくまでもJSFフレームワークが管理することによるデメリットです。すべてをSpringが管理するのならばEJB3のようにアノテーションをつけるだけでいけるのでしょう。ですが、現状そういうことはできません。

というわけで、どちらの方法もとらないことにする。ようはELを解釈させてあげればいいわけだ。アクション部分を以下のように修正し、privateなフィールドを追加した。

これならGuiceの@InjectやSpring2.5の@Autowired、EJB3の@EJBのようにプル型っぽく手軽に扱える。もちろん、Spring同士は@Componentと@Autowiredをつかって素直に書けばいい。


実行するとSpringのコンポーネントが呼ばれているのがわかるはずだ。


これでJSFとSpringとの連携のお話は終わり。

だが、個人的には前回のようにJSFJSPにSpringで管理されたオブジェクトをセットしてあげるのは反対だ。あくまでもJSFで管理されたビーンにビューに関係あることを記述、Springはその裏で動いているだけのほうが望ましい。そうしないと、1つの画面だけでもJSFとSpringどちらで管理されているのか判断するのが難しくなり、メンテナンス性を大幅に下げるはずだからだ。

同様にSpring管理下のオブジェクトにもrequestやsessionスコープを持たせることが出来るが、これも扱わないほうがいいだろう。JSFのセッションビーンとどちらを参照すればいいのかがわからないからだ。

あくまでもビューやコントロールJSFが徹するべきだと思うし、その中で動くロジックはSpringで実装して意識的に層を分離するのがいい。ビューのための加工であるビューヘルパーもJSF側で管理したほうがいいだろう。

そうすればフロントエンドがstrutsになろうが、Railsになろうが、WebサービスSOAPなど)になろうが変更に強いシステムになる。