NetBeans6.0のVisual Web JSFでSpring2.5を使ってみる その6
今度はJavaのコード、つまり管理されたページビーンからSpringのコードを呼び出したいと思う。
基本的に2つの方法がある。ひとつはアプリケーションコンテキストというSpringのコンポーネントを管理しているところから直接取得する方法。もうひとつはJSFの管理されたビーンにセッターを使ってセットしてあげる方法だ。
一つ目は一番基本的なものだが、これをいちいち呼び出していたらSpringを扱って楽をするメリットが減る。EJB3ならばアノテーションをつけるだけで自動的にEJB参照となって手軽に扱えるのに。
2つめはJSFのELを解釈させることによってSpringで管理されるオブジェクトを取得する。
はっきりいって面倒くさすぎ。Javaといえばシンプルで軽いプログラムが売りなので(ここ数年はなんか変だったけど)こんなの認められない。
これは管理されたビーンはあくまでもJSFのフレームワークが管理することによるデメリットです。すべてをSpringが管理するのならばEJB3のようにアノテーションをつけるだけでいけるのでしょう。ですが、現状そういうことはできません。
というわけで、どちらの方法もとらないことにする。ようはELを解釈させてあげればいいわけだ。アクション部分を以下のように修正し、privateなフィールドを追加した。
これならGuiceの@InjectやSpring2.5の@Autowired、EJB3の@EJBのようにプル型っぽく手軽に扱える。もちろん、Spring同士は@Componentと@Autowiredをつかって素直に書けばいい。
実行するとSpringのコンポーネントが呼ばれているのがわかるはずだ。
これでJSFとSpringとの連携のお話は終わり。
だが、個人的には前回のようにJSFのJSPにSpringで管理されたオブジェクトをセットしてあげるのは反対だ。あくまでもJSFで管理されたビーンにビューに関係あることを記述、Springはその裏で動いているだけのほうが望ましい。そうしないと、1つの画面だけでもJSFとSpringどちらで管理されているのか判断するのが難しくなり、メンテナンス性を大幅に下げるはずだからだ。
同様にSpring管理下のオブジェクトにもrequestやsessionスコープを持たせることが出来るが、これも扱わないほうがいいだろう。JSFのセッションビーンとどちらを参照すればいいのかがわからないからだ。
あくまでもビューやコントロールはJSFが徹するべきだと思うし、その中で動くロジックはSpringで実装して意識的に層を分離するのがいい。ビューのための加工であるビューヘルパーもJSF側で管理したほうがいいだろう。
そうすればフロントエンドがstrutsになろうが、Railsになろうが、Webサービス(SOAPなど)になろうが変更に強いシステムになる。