BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース SpringとSeamのハイブリッドコンポーネント

SpringとSeamのハイブリッドコンポーネント

Spring(サイト・英語)とJBoss Seam(サイト・英語)はそれぞれエンタープライズウェブアプリケーション開発のための異なる機能群を提供している。SpringはJavaEEのミドルウェアフレームワークで、POJO Abstractionや依存性注入(DI)(source)やアスペクト指向プログラミング(AOP)といった機能を備え、またHibernate(source)やTopLink(サイト・英語)やiBatis(サイト・英語)といったフレームワークとの統合もできるようになっている。一方Seamはウェブアプリケーションのフレームワークで、AJAXやJava Server Faces(JSF)やEnterprise Java Beans(EJB 3)やJava PortletsやBusiness Process Management(BPM)といったテクノロジを備えている。この2つのフレームワークを使ってウェブアプリケーションを開発することは可能なのだろうか。そしてそれは意味のあることなのだろうか。この問題は最近ブログやJavaコミュニティのフォーラムの議論でテーマとして扱われ、特にどちらのフレームワークの方が両方の良い所を扱えるかというのが論点となった。

Dan Allen氏(source)はウェブアプリケーションの中でSpringとSeamフレームワークを統合することについて、最近2つの記事を書いた。最初の記事(source)では、SeamとSpring両方のコンテナ機能性から長所を得ることができるハイブリッドコンポーネントをどう作るかについて説明している。そこでは、 SeamはJSFやJPA、EJB 3、その他のテクノロジを扱えるが、Springが標準で持っている軽量リモーティグ、AOP宣言、フレームワークテンプレートクラス、リソース注入といった機能をサポートしていない、と言う。この点でSpring-Seamハイブリッドコンポーネントが必要になってくる。これはSeamのコンテナと Springのコンテナの両方から機能的な恩恵を受けるオブジェクトだ。SeamはSpring Frameworkをウェブアプリケーションに組み込むモジュールを提供し、アプリケーションのコンポーネントや低レベルのリソースの共有を管理することになる。

彼はウェブアプリケーションのサンプルを用いながらSpringビーンをSeamアプリケーションに組み込む方法を説明している。これはSeamのContextLoader(source)コンポーネントを使ったり、Springタグの中にseam:componentタグ(source)を書くことでSpringビーンをSeamコンポーネントとして扱えるようにすることで実現している。彼は別のSpringとSeamの統合方法として、カスタム式言語リゾルバ(source)を通してSeamコンテナとSpringを間接的に通信させる方法も示した。

2つ目の記事(source)では、Springビーンにステートフルな振舞を加えることについて述べている。これはSpringフレームワーク単独の場合でも難しいことだ。しかしSeamのカスタムスコープハンドラを登録すればSpringビーンをSeamの処理に組み込むことができ、一時対話(source)(redirect-after-postパターンを実現するため)や長期対話(単一ユーザのpage flow用)やビジネスプロセスのスコープで、期間を超えて複数のユーザがやり取りを行えるようになる。こうすることで、HTTPセッションを使わなくてもSpringビーンをステートフルにできるのだ。

彼はSprintとSeamを一緒に使用する際のランタイムでのスコープやスレッドセーフの問題を議論していた。Springは生成時のみ依存性を注入するのに対し、Seamはメソッドが呼び出されるごとに依存性を動的に注入する。この設計上のフィロソフィの違いは「スコープインピーダンス」のパラドックスへとつながる。これはビーンがコンポーネントに属することで、ビーン自体のライフタイムより長く(=コンポーネントのライフタイム)存在し続けてしまえることだ。このような状況は異なるスコープのコンポーネントにSpringが静的な依存性注入をおこなった時に起きる。Seamにはスコープインピーダンスとスレッドセーフの両方の問題を回避する方法がある。それは、ref要素を使ってビーンのインスタンスを直接注入するのでなく、 seam:instanceタグ(source)を使ってプロキシを注入するやり方だ。

コミュニティのいくつかのフォーラムでも興味深い議論が行われている。Rick Hightower氏(source)はSeam 2.0.1(source)の機能の概要を示して、SeamとSpringを一緒に使うことについてのスレッドを立てた(source)。そこでは以下の問いが挙げられた。

  • もしSeamとSpringを使っていて、どちらかしか使えないとなったら、どっちを残すだろうか?
  • SeamでEJB 3を使うか使わないか?
  • SeamでSpringを使うか使わないか?
  • Seamの生成ツールはどれくらい優れているか?
  • SeamはJPAやJSFベースのアプリケーションを書くのに一番良い選択肢か?
  • SpringとSeamはどの部分でオーバーラップし、オーバーラップするところではどっちが優れているか?

最近Spring 2.5.4(source)とSeam 2.0.1 GA(一般利用可能)バージョンがリリースされた。この2つのフレームワークについてのInfoQのニュースは、Springのページ(参考記事)とSeamのページ(参考記事)を見てほしい。

 原文はこちらです:http://www.infoq.com/news/2008/05/spring-seam-hybrid

この記事に星をつける

おすすめ度
スタイル

BT