Powered by SmartDoc

Java EE と Enterprise JavaBeans (EJB)

Enterprise JavaBeans (EJB) とはなにか

3層モデル

Java2 Platform, Enterprise Edition (以下Java EE、旧称J2EE)は、企業情報システムなどの「エンタープライズ・アプリケーション」で必要になる技術をまとめたものです。

エンタープライズ・アプリケーションでは、図1.1[3層モデル]のような「3層モデル(three-tier model)」という仕組みがよく利用されます。これは、エンタープライズ・アプリケーションに必要な機能を3つに分けたものです。

3層モデル

左側の層はクライアントです。WebアプリケーションではWebブラウザを用います。ユーザは、WebブラウザからあるURLを呼び出すだけで、アプリケーションを利用できます。

中間の層では、「J2EEサーバ」が動いています。また、J2EEサーバの中に、「Webコンテナ(あるいはサーブレットコンテナ)」と呼ばれるものが組み込まれており、後述するServletやJSPはこのWebコンテナ内で動いています。

右側の層はデータベースです。多くのWebアプリケーションでは、さまざまなデータを取り扱います。そのために、データベースを利用するのが良い場合が多くなります。

Enterprise JavaBeans (EJB)

Enterprise JavaBeans (EJB)は、「ビジネスロジック」や「データの永続化」をコンポーネント化したものです。「ビジネスロジック」は、そのアプリケーションでの本質的な処理の部分を指します。「データの永続化」は、メモリ上のデータをファイルシステム上に保存して、プログラムが終了してもデータは残るようにするしくみのことです。

なお、EJBは「EJBコンテナ」上で動作します。

EJBには、次に挙げるように3つの種類があります。それぞれについてご紹介しましょう。

Session Beans

Session Beansは、クライアントが必要に応じて呼び出す処理をまとめたものです。クライアントの特定のセッションに対応しており、セッション開始と同時に生成され、セッション終了時に消滅します。

Session Beansにも、2つの種類があります。

ひとつめは、"Stateless Session Beans"です。Stateless Session Beansは、インスタンスに固有のフィールドがないため内部状態を持たず、ユーティリティクラスのように振る舞うEJBです。

ふたつめは、"Stateful Session Beans"です。こちらは内部状態を持っています。

Entity Beans

Entity Beansは、「永続化」されているデータとの対応に用いるEJBです。

こうした技術は、よく"O/R Mapping"と呼ばれています。これは、リレーショナルデータベースのテーブルの1行と、Entity Beanの(基本的には)ひとつのインスタンスが対応することを指します。そして、リレーショナルデータベースとEntity Beanの間で同期が行われます。

EJB 3.0では、Entity Beanに"Java Persistence API"が用いられます。

Message-driven Beans

Message-driven Beansは、Java Message Service (JMS)のメッセージを非同期に処理するためのEJBです。

Message-driven Beansについては、本講義では扱いません。

EJB 批判

これまでEJBは、Javaを使ったエンタープライズ・アプリケーション開発における基本技術として、かなり普及してきました。しかし、普及しつつも、常にさまざまな批判にさらされて存在でありました。

例えば、後述するSpring Frameworkの作者であるRod Johnsonからは、「従来のEJBは存在自体が間違いだった」などと言われています(ITproより。http://itpro.nikkeibp.co.jp/free/NSW/NEWS/20050621/163065/)。

EJBの批判のポイントは2つあります。

ひとつめは、EJBが複雑すぎるという点です。これまでEJBを開発するには、たくさんのプログラムを開発する必要がありました。「Homeインタフェース」「Remoteインタフェース」「実装クラス」のように、最低でも3つのクラスとインタフェースを作成する必要があります。また、設定すべき項目もたくさんあります。そして、それぞれの関係性がわかりにくい構造になっています。

ふたつめは、制約が多すぎるという点です。EJBのプログラムは、コンテナに依存しきったものになりがちです。コンテナから必要な情報を取得するように作成しなければならず、また「RemoteインタフェースはEJBObjectを継承する」といったような多数の制約も存在します。こうした理由から、単体テストが困難になるという弊害もありました。

そのようなEJB批判から、たくさんの代替となるソフトウェアが産み出されました。

まず、EJBコンテナよりも扱いやすい「軽量コンテナ」のソフトウェアとして、次のようなソフトウェアがあります。

そして、「O/R Mapping」のソフトウェアとして、次のものがあります。

こうしたソフトウェアは、EJBの代替技術として、元のEJBよりも広く使われるようになってきました。

EJB 3.0 の登場

仕様の追加

こうしたEJB批判の流れを受け、2006年5月にEJB 3.0が正式リリースされました。

EJB 3.0では、これまでのEJB批判を受け止め、大幅に仕様を追加していますEJBの「標準的な」書き方が一変したため、一見すると仕様変更のように思えるくらいです。

EoDという考え方

EJB 3.0の根底にながれているのは、"EoD"という考え方です。

EoDは「Ease of Development (=開発の容易性)」というコトバの短縮形です。「開発の容易性」とは、「いかにラクにソフトウェアを開発するか」ということです。

Javaの世界では数年前から多用されているコトバで、J2SE 5.0, JSF, EJB 3.0など、最近のJava技術はEoDの考え方を基本としているものが多くなっています。

POJOとPOJIの採用

まず、従来の(EJB 2.1の) EJBをご紹介しましょう。

ひとつめは、「Remoteインタフェースを継承したインタフェース」です。このようなカタチになります。

public interface SavingsAccount extends EJBObject {
	............
}

次に、「EntityBeanインタフェースを実装したクラス」です。

public class SavingsAccountBean implements EntityBean {
	............
}

これが、EJBのプログラムの基本スタイルです。EJB独自のインタフェースを実装または継承しているため、EJBの規則に従ったオブジェクトになっています。

EJB 3.0では、ちょっと違ったプログラミングスタイルになっています。"POJO"と"POJI"を採用しています。

"POJO"は、"Plain Old Java Object"の略です。直訳すると「純粋で古いJavaオブジェクト」となります。また"POJI"は、"Plain Old Java Interface"の略です。やはり直訳すると「純粋で古いJavaインタフェース」となるでしょう。

ここで言う「純粋で古い」とは、「特定のソフトウェアへの依存性がない」ことを指しています。

EJB 3.0では、EJB独自の技術とは切り離されている、POJOとPOJIをEJBとして使うことができるのです。POJOやPOJIを採用することによって、単体テストが簡単になるというメリットも出てきます。

Annotationの利用

Annotationは、J2SE 5.0 (Tiger)から登場した新しい仕様です。ソースコード中にメタデータを加えます。EJB 3.0では、POJO / POJIにAnnotationを加えて、開発すべきプログラムや設定ファイルを減らすことができます。

軽量コンテナ

軽量コンテナは、POJOを対象としたコンテナです。EJB 3.0ではEJBにPOJO/POJIが使われるので、コンテナは軽量コンテナとなります。前述のとおり、軽量コンテナは、Spring Framework, Seaser2などで既に使われている技術です。

Dependency Injection (依存性注入)

前述したとおり、従来のEJBは、EJBがコンテナから必要な情報を取得して、その情報を使って処理を進めてきました。

しかしEJB 3.0のような、POJOと軽量コンテナを使った環境では、「コンテナがEJBに必要な情報を与える」という考え方が採用されています。これがDependency Injection (DI =依存性注入)です。EJB 3.0では、Annotationを利用しています。DIのおかげで、コンポーネント間の依存性を減らすことができます。

Dependency Injection (DI)は、もともとはInverse of Control (= IoC =制御の反転)と呼ばれていました。これを、UMLやパターンの書籍で著名なMartin Fowlerが"Dependency Injection"と呼ぶことを提唱して、現在この呼び方が一般的になっています。

EJBの仕様

EJB 3.0は、Java Community Process (JCP)で、「JSR 220」として仕様策定が進められてきました。2006年5月にJava EE 5とともに正式リリースしています。次章で述べる「Project GlassFish」が、Java EE 5の参照実装という位置づけになっています。

EJB 3.0に関連する仕様は3つあります。

1つめは、"Java Persistence API"です。これは永続化のためのAPIです。Entity Beanで、O/R Mappingに使われています。将来的には、Java EEの環境下だけでなく、Java SEでも利用される予定です。

2つめは、"EJB 3.0 Simplified API"です。これは、"Java Persistence API"を除いたEJB 3.0のAPIです。

3つめは、"EJB Core Contracts and Requirements"です。EJBのアーキテクチャについて記述されています。