J2EE関連の最新仕様をわかりやすく解説

J2EE Watch [2]

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

テクニカルライター
吉川和巳
2004/5/21


J2EE Watchでは、J2EE関連の最新仕様に関するトピックを取り上げ、わかりやすく解説します。(編集局)


 サン・マイクロシステムズは、Enterprise JavaBeans(EJB)の次期バージョンである「EJB 3.0」の概要を公開した。5月7日に米国ラスベガスにて開催された技術者会議「TheServerSide Java Symposium」において、同社のLinda DeMichiel氏が明らかにしたもの。

 EJB 3.0では、開発の容易さ(ease of development)の実現に向けて、大幅な仕様変更が施される。これは、従来のEJBコンポーネントの開発における最大のネックであった「作成手順やAPIが複雑なため開発に手間が掛かる」「アプリケーション・サーバ上でしか動作せずユニットテストが困難」「O/Rマッピング機能(CMP Entity Bean)が使いにくい」という問題の解消を目的としている。今回の変更は、「POJO(Plain Old Java Object)」つまりごく普通のJavaオブジェクトやJavaBeansをそのままEJBコンポーネントとして利用可能にするという、大胆な方向転換となる見込みだ。

 この変更の背景には、上述したEJBの不便さへのアンチテーゼとしてさまざまなオープンソース・ソフトウェアが台頭しつつある現状がある。そうしたソフトウェアの例としては、「Spring」や「PicoContainer」「Seasar」などの軽量コンテナ(小規模なフレームワーク)や、O/Rマッピング・フレームワーク「Hibernate」がある。これらは、いずれもPOJOをベースとした小回りの利くJ2EE開発を可能にすることで幅広い支持を得ている。また、オープンソースのEJBサーバとして絶大な人気を誇る「JBoss」も、次期バージョンではEJBの枠を超えてAOP(Aspect Oriented Programming)の考え方を導入、EJBコンポーネントと同等の能力をPOJOに持たせるフレームワークを提供する。

 そこでEJB 3.0では、これらのオープンソース・ソフトウェアの成果を大々的に導入し、POJOを中心としたコンポーネント・モデルへの転身を図っている。JBossやHibernateの開発者を仕様策定プロセスに迎え入れ、軽量コンテナと同様の手軽さでEJB開発を実現するもくろみだ。もっとも、既存のEJBコンポーネント・モデルもそのまま残される予定であり、必要に応じて従来型のEJB開発を選択することも可能だ。

アノテーションとDependency Injectionを採用

 EJB 3.0では、POJOベースの開発を実現するための手段として、「アノテーション」と「Dependency Injection」という2つの新しいテクノロジが採用されている。アノテーションとは、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というアノテーションを追加する。

 EJB 3.0のもう1つの特長を表すDependency Injection(依存性注入)とは、SpringやPicoContainerなどの軽量コンテナに共通する性質を示すためにMartin Fowler氏が提唱した用語である。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風に

 EJB 3.0のもう1つの変化は、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の発行などがサポートされると予想されている。

EJB 3.0ではテスト主導型開発が可能に

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

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




Java Solution全記事一覧

 



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

注目のテーマ

Java Agile 記事ランキング

本日 月間