“誰もが書けるEJB”を実現する「EJB 3.0」


“誰もが書けるEJB”を実現する「EJB 3.0」

アノテーション

  • アノテーションとは、JDK 1.5で新たに追加される言語仕様
  • Javaコード上でメタデータ(コードそのものではなくコードに関する付加情報)を記述可能にする。
  • これは、マイクロソフトC#における属性(attribute)に相当するシンタックス

例えば、EJB 3.0におけるSession Bean(ビジネス・ロジックを実行するためのEJBコンポーネント)は、アノテーションを用いて以下のようなスタイルで記述される。

@Session public class CalculatorBean {
   public int add(int a, int b) {
       return a + b;
   }
   public int subtract(int a, int b) {
       return a - b;
   }
}

このように、@Sessionというアノテーションをクラス宣言の行頭に入れておくことで、ごく普通のJavaクラスに対してSession Beanとしての能力(トランザクション管理やセキュリティ管理、リソース管理など)を後付けできる。この際、従来のEJB開発の面倒さを象徴していたホーム・インターフェイスやリモート・インターフェイス、XMLベースのDD(Deployment Descriptor)の作成作業は、すべて不要となる。

 また、これまでのDD中に記述していた設定情報は、アノテーションを通じてJavaクラスそのものに記述する。EJB 3.0では大半の設定項目にデフォルト値が用意されるため、開発者は微調整したい部分にのみアノテーションを記述すればよい。例えば、分散オブジェクトによる通信機能が必要であれば、そのときだけ@Remoteというアノテーションを追加する。

Dependency Injection

  • 「コンテナのサービスをコンポーネントから呼び出す」のではなく、「コンポーネントに対しコンテナがサービスを注入する」という方法
  • コンポーネントがさまざまなサービスやAPI、またはほかのコンポーネントに依存してしまうことを防ぐ技法

 EJB 3.0におけるDependency Injectionの例を1つ紹介しよう。例えば、EJB 2.1以前のEJBコンポーネントにおいて、DataSource?(データベースに接続するためのオブジェクト。コネクション・プーリングやトランザクション管理機能を提供する)を利用するには、JNDI APIを用いたオブジェクト検索や例外のキャッチといった冗長なコーディングが必要であった。これに対し、EJB 3.0では以下のように記述することでDataSource?を取得できる。

@Session public class MyBean {

   private DataSource customerDB; 

   @Inject private void setCustomerDB(DataSource customerDB) {
     this.customerDB = customerDB;
   }
} 

 ここで、メソッドsetCustomerDBにおいて用いられている@Injectというアノテーションは、「このメソッドを通じてDataSource?を注入してほしい」という指示をEJBコンテナに伝えるためのものだ。これにより、上述したJNDIプログラミングを省略でき、POJOとしての純粋さ、再利用性の高さを維持できるのである。

Entity BeanはHibernate風に

  • CMP Entity Beanが提供するO/Rマッピング機能もPOJOベースに移行
  • O/Rマッピング・フレームワークHibernateにかなり近いもの
  • ただし、HibernateにおけるXMLベースの設定ファイルの代わりに、アノテーションを活用

すなわち、Javaクラスのアクセサ・メソッドに対しアノテーションを施すことで、そのフィールドとデータベース上のテーブル―カラム間の値が自動的に同期されるというメカニズムだ。このように、POJOをそのままEntity Beanとして扱うことができれば、従来のEJB開発でWeb層とのデータ交換に利用されてきたDTO(Data Transfer Object)パターンはもはや不要となる(実のところ、J2EEパターンの多くはEJBの使いにくさを緩和するために生み出されたアンチパターンであるという見方もある)。

データベース検索のためのクエリ言語EJB QL(Query Language)も強化

新しいEJB QLでは、副SELECT文やアウタージョイン、複数行のバッチ更新、さらにはネイティブSQLの発行などがサポートされると予想されている。

テスト主導型開発が可能に

  • POJOを中心としたプログラミング・モデルへ移行
  • テスト主導型開発(test driven development)をより積極的に推し進められる
    • POJOであれば、アプリケーション・サーバのない環境であっても簡単にオブジェクトを生成し、ユニットテストを記述することができる。
    • よって、コーディングとテストのサイクルを短縮化でき、より身軽でアジャイルなEJB開発が可能になるはずだ。

 もっとも、EJB 3.0が実際に利用可能になるのはまだ先の話である。6月にはパブリック・レビューを迎え、その後J2EE 1.5と併せて2005年には最終リリースされる予定である。よって、同仕様に準拠したJ2EEサーバ製品が提供され始めるのもその時期になると見込まれる。