第1回 JSF・Spring・Hibernateで次世代Javaに備える


  Page.1 Page.2

 EJBコンテナ関連の変更

 Java EE 5の仕様変更で、最も重要なものがEJB 3.0(JSR-220)です。EJBはエンタープライズレベルのアプリケーションを開発するうえで非常に重要な機能を持っているにもかかわらず、その開発の難しさから敬遠される傾向がありました。XDocletの登場によりEJBの開発そのものは簡単になりましたが、EJBの実装をテストするためにはEJBコンテナにデプロイする必要があるため、動作確認に手間と時間がかかることが問題となっていました。

 EJB 3.0では、Session Bean、Entity Bean、およびMessage Driven BeanのすべてをPOJOとして実装することができます。これにより、従来に比べて飛躍的に実装が簡単になると同時に、EJBコンテナを必要とせずに単体テストを実施することができるようになります。

 EJB 3.0の仕様の最新版では、以下の3つの仕様書に分割されています。

  1. EJB 3.0 Simplified API
  2. EJB 3.0 Persistence API
  3. EJB Core Contracts and Requirements

 1.はEJB 3.0全体にわたってアノテーションによるEJB開発がいかに簡単になるかを示したドキュメントになっています。2.はPOJOになった新しいEntity BeanとO/Rマッピングについての仕様です。3.は従来のEJB 2.1を含めてコンテナが満たすべき要件を示しています。

EJB 3.0のアノテーション

 従来のSession Beanの実装には、EJB本体以外にホームインターフェイスやリモート/ローカルインターフェイスを実装する必要がありましたが、EJB 3.0のSession BeanはPOJOとして開発することができます。

@Stateless public class MySessionBean {
  public void myMethod1(String myString) {...}
}

 これはちょうど、XDocletと同様の機能が標準に備わったものと考えていいでしょう。しかし、EJB 3.0の新機能はこれだけではありません。Springフレームワークなどで実現されている、依存性の注入(DI:Dependency Injection)の機能やAOP(Aspect Oriented Programming)の機能が盛り込まれる予定になっています。これらの技術は、アプリケーションのコードをシンプルにし、再利用可能なコンポーネントに保つのに有効に働きます。以下はDataSourceをDAO(Data Access Object)にインジェクションする場合の例です。

@Resource(name="myDB")
public DataSource customerDB;

 また、EJBの参照をクライアントのオブジェクトにインジェクションすることもできます。

@EJB(name="mySessionBean")
public MySessionIF mySession;

 いずれの場合も、JNDIをルックアップするコードが一切必要ないことに注意してください。

 また、EJB 3.0にはインターセプターという重要な機能が含まれることになっています。インターセプターとはAOPの一種で、特定のビジネス処理にかかわらず、共通の 機能を横断的に適用したいときに有効な仕組みです。インターセプターの例としては、トレース出力、セッション管理、トランザクション管理などが代表的な例です。

図1 インターセプター

 図1に示すように、インターセプターを使用しないビジネスロジックはビジネスロジックとは直接関係のない処理が混在し、ひどく読みにくいものになりがちです。共通の機能をビジネスメソッドのインターセプターとして分離し、自由に組み込める(weaving)ようにすることで、ビジネスメソッドの実装は本来のビジネスロジックに注力した可読性の高いソースコードに保つことができます。EJB 3.0では@Interceptorsによって、任意のメソッドの前処理や後処理を追加することができます。

/** ビジネス・オブジェクト */
@Stateless
@Interceptors("Tracer")
public class MySessionBean {
  public void myMethod1(String myString) {...}
}

/** インターセプター */
public class Tracer {
  @AroundInvoke
  public Object trace(InvocationContext inv) {...}
}

 上記のほかにもCommon Annotations(JSR-250)として有用なアノテーションが定義されています。

 DIやインターセプターは、EJBに特化した機能ではなく、もっと汎用的に使われるべきものではないかという疑問を抱く人もいるようです。おそらく、これらの機能は将来的にはJ2SEに含まれるようになると思われます(JMXがJ2SE 5.0から標準のAPIになったことに注意してください)。

POJOになったEntity Bean

 Session Beanと同様Entity BeanもPOJOとして実装できるようになります。EJB 3.0のO/Rマッピングの仕様は、現在オープンソースのパーシステント・レイヤのフレームワークとして最もよく使われているHibernateの仕様と非常によく似たものになっています。これは、JSR-220のエキスパート・グループにHibernateの設計者であるGavin Kingが参加しており、大きな影響力を持っているためです。逆にいえば、これから開発するアプリケーションでは、データベース・アクセスに J2EE 1.4標準のCMPベースEntity Beanを使うよりも、Hibernateを使用した方がJava EE 5へのマイグレーションは行いやすいといえます。

 ここで簡単にHibernateとEJB 3.0 Entity Beanの類似点を紹介しておきます。

  • HibernateのSessionのAPIは、EJB 3.0のEntityManagerのAPIで代用可能である
  • HibernateのO/Rマッピングの概念の多くは、EJB 3.0に引き継がれている
     − IDジェネレータ
     − 単方向関連(one-to-many、 many-to-one、 many-to-many)
     − バリュー・タイプ(コンポーネント型オブジェクト)
     − インヘリタンス
  • EJB-QLでは、HibernateのHQLと同様の名前付きパラメータが使える

 また、最新のトピックスとしては2005年6月末に開催されたJavaOneの会期中に公開されたJSR-220のPR版では、データベースの入出力をPOJOでやりとりするEntityManagerをEJBコンテナの外でも利用可能にすることが仕様化されました。これは、Entity Beanの単体テストを容易にするだけでなく、EntityManagerを軽量コンテナとして利用する新しい使い道が登場することを示唆しています。例えば、SwingをインターフェイスとするPIMデータベース管理のスタンドアロン・アプリケーションなどが考えられます。

 このように、Java EE 5はEoDを目指した非常に魅力的な開発環境になることが分かります。その一方で、これから開発しようとするアプリケーションの資産がJava EE 5でも、再利用できるかどうかも心配になります。しかし、安心してください。J2EE 1.4の現状であっても、JSF、Spring、Hibernateを組み合わせたアーキテクチャを採用することにより、Java EE 5と同等のPOJO、DI、インターセプター、POJOベースのパーシスタンスを利用した再利用可能なコンポーネントを開発することができます。

 次回は、JSF、Spring、Hibernateを組み合わせたアーキテクチャの詳細について解説します。

2/2  

 INDEX

第1回 JSP・Spring・Hibernateで次世代Javaに備える
  Page1
Java EE 5仕様の構成
Webコンテナ関連の仕様
Page2
EJBコンテナ関連の仕様



Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間