Java2 Platform, Enterprise Edition (以下Java EE、旧称J2EE)は、企業情報システムなどの「エンタープライズ・アプリケーション」で必要になる技術をまとめたものです。
エンタープライズ・アプリケーションでは、図1.1[3層モデル]のような「3層モデル(three-tier model)」という仕組みがよく利用されます。これは、エンタープライズ・アプリケーションに必要な機能を3つに分けたものです。
左側の層はクライアントです。WebアプリケーションではWebブラウザを用います。ユーザは、WebブラウザからあるURLを呼び出すだけで、アプリケーションを利用できます。
中間の層では、「J2EEサーバ」が動いています。また、J2EEサーバの中に、「Webコンテナ(あるいはサーブレットコンテナ)」と呼ばれるものが組み込まれており、後述するServletやJSPはこのWebコンテナ内で動いています。
右側の層はデータベースです。多くのWebアプリケーションでは、さまざまなデータを取り扱います。そのために、データベースを利用するのが良い場合が多くなります。
Enterprise JavaBeans (EJB)は、「ビジネスロジック」や「データの永続化」をコンポーネント化したものです。「ビジネスロジック」は、そのアプリケーションでの本質的な処理の部分を指します。「データの永続化」は、メモリ上のデータをファイルシステム上に保存して、プログラムが終了してもデータは残るようにするしくみのことです。
なお、EJBは「EJBコンテナ」上で動作します。
EJBには、次に挙げるように3つの種類があります。それぞれについてご紹介しましょう。
Session Beansは、クライアントが必要に応じて呼び出す処理をまとめたものです。クライアントの特定のセッションに対応しており、セッション開始と同時に生成され、セッション終了時に消滅します。
Session Beansにも、2つの種類があります。
ひとつめは、"Stateless Session Beans"です。Stateless Session Beansは、インスタンスに固有のフィールドがないため内部状態を持たず、ユーティリティクラスのように振る舞うEJBです。
ふたつめは、"Stateful Session Beans"です。こちらは内部状態を持っています。
Entity Beansは、「永続化」されているデータとの対応に用いるEJBです。
こうした技術は、よく"O/R Mapping"と呼ばれています。これは、リレーショナルデータベースのテーブルの1行と、Entity Beanの(基本的には)ひとつのインスタンスが対応することを指します。そして、リレーショナルデータベースとEntity Beanの間で同期が行われます。
EJB 3.0では、Entity Beanに"Java Persistence API"が用いられます。
Message-driven Beansは、Java Message Service (JMS)のメッセージを非同期に処理するためのEJBです。
Message-driven Beansについては、本講義では扱いません。
これまで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批判の流れを受け、2006年5月にEJB 3.0が正式リリースされました。
EJB 3.0では、これまでのEJB批判を受け止め、大幅に仕様を追加していますEJBの「標準的な」書き方が一変したため、一見すると仕様変更のように思えるくらいです。
EJB 3.0の根底にながれているのは、"EoD"という考え方です。
EoDは「Ease of Development (=開発の容易性)」というコトバの短縮形です。「開発の容易性」とは、「いかにラクにソフトウェアを開発するか」ということです。
Javaの世界では数年前から多用されているコトバで、J2SE 5.0, JSF, EJB 3.0など、最近のJava技術はEoDの考え方を基本としているものが多くなっています。
まず、従来の(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は、J2SE 5.0 (Tiger)から登場した新しい仕様です。ソースコード中にメタデータを加えます。EJB 3.0では、POJO / POJIにAnnotationを加えて、開発すべきプログラムや設定ファイルを減らすことができます。
軽量コンテナは、POJOを対象としたコンテナです。EJB 3.0ではEJBにPOJO/POJIが使われるので、コンテナは軽量コンテナとなります。前述のとおり、軽量コンテナは、Spring Framework, Seaser2などで既に使われている技術です。
前述したとおり、従来の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 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のアーキテクチャについて記述されています。