Dev Study
← 解説「EJB が要求したものと Spring の登場」に戻る

サンプルコードで身につける: EJB が要求したものと Spring の登場

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1EJB 2.1 のセッション Bean に必要だったもの

2.1 仕様(2003年11月)の 7.11 節が、部品を提供する人の責任として挙げているものを表にしました。は必ず2つ1組で、片方だけでは認められません。リモートから呼べる部品1つには、1つとインターフェース2つに加えて、それらを記述する XML()が要ります。

EJB 2.1 仕様 7.11(セッション Bean を提供する人の責任)から表
用意するもの | いつ必要か
-----------------------------------+------------------------------------------
Bean クラス | 必ず
javax.ejb.SessionBean の実装 | 必ず(7.11.2)
ejbCreate メソッド | 1つ以上。ステートレスなら引数なしを1つ(7.11.3)
リモート + リモートホーム | リモートから呼ばせるなら。2つ1組
ローカル + ローカルホーム | ローカルから呼ばせるなら。2つ1組
Web サービス用のインターフェース | Web サービスとして呼ばせるなら
META-INF/ejb-jar.xml | デプロイ記述子として ejb-jar ファイルに入れる

2Bean クラスの形(擬似コード)

EJB 2.1 の の構造を、自作の例でコメントとして書いたものです。業務は1つですが、SessionBean を実装するので、から呼ばれるメソッドも並びます。Sun の 1.4 Tutorial の例でも、業務メソッド2つのクラスに中身が空のメソッドが5つ並んでいます。

// ShippingFeeBean — EJB 2.1 の Bean クラスの形
// (構造を示すための擬似コード。コメントなのでこのままでは何も動かない)
//
// public class ShippingFeeBean implements SessionBean {
//
//     // 業務メソッド。書きたいのはここだけ
//     public int total(int itemPrice, String region) { ... }
//
//     // ここから下はコンテナから呼ばれるメソッド。使わなくても書く
//     public void ejbCreate() {}
//     public void ejbRemove() {}
//     public void ejbActivate() {}
//     public void ejbPassivate() {}
//     public void setSessionContext(SessionContext context) {}
// }
//
// このクラスは単独では部品にならない。ほかに次のものを用意する
//   ShippingFee      — リモートインターフェース(EJBObject を継承)
//   ShippingFeeHome  — ホームインターフェース(EJBHome を継承。create だけを持つ)
//   ejb-jar.xml      — 上の3つを結びつけるデプロイ記述子
//
// リモートインターフェースの業務メソッドは throws に RemoteException を持つ

3対比: POJO は new するだけで確かめられる

同じ業務ロジックを、何も・実装しない素のクラスで書いた例です。サーバもコンテナも起動せずに、new して呼ぶだけで動きを確かめられます。最後の2行は、このクラスが Object 以外を継承せず、インターフェースも実装していないことをで表示しています。

Java

4EJB 3.0 の仕様が自分で外したもの

EJB 3.0 Simplified API(2006年5月)が、目標と簡素化の内容として挙げている文を、2.1 の要求と並べました。外した側の言葉で読むと、何が負担と見なされていたかが分かります。3.0 はの仕組みも仕様に取り入れ、2.1 の API も使えるまま残しました。

EJB 2.1 の要求 → EJB 3.0 Simplified API の文言(1.2 節・2章)表
ホームインターフェース
→ Elimination of the requirement for home interfaces for session beans.
 
EJBObject を継承したインターフェース
→ The required business interface for a session bean can be a plain Java interface
rather than an EJBObject, EJBLocalObject, or java.rmi.Remote interface.
 
Bean クラスによる javax.ejb の型の実装
→ elimination of the requirements for enterprise beans to implement the
javax.ejb.EnterpriseBean interfaces.
 
デプロイ記述子
→ Introduction of Java metadata annotations to be used as an alternative to
deployment descriptors.
 
(新しく入ったもの)
→ definition of a dependency injection facility and simpler look-up APIs.

5年表: POJO・EJB・Spring・依存性の注入

この回の出来事を日付順に並べました。 という語(2000年)は より前からあり、Dependency Injection という名前は Spring 1.0 の2か月前に付いています。Spring 0.9 の changelog は、0.9 を the version that came with the book 以来の最初の公開版と書いており、その本が2002年の書籍です。

一次ソースで日付を確かめられた出来事表
2000年9月 POJO という語が作られる(Rebecca Parsons、Josh MacKenzie、Martin Fowler)
2001年9月 EJB 2.0 Final Release(JSR 19)
2002年10月 Rod Johnson『Expert One-on-One J2EE Design and Development』
2003年6月 Spring 0.9(changelog の日付。書籍に付いていた版以来の最初の公開版と記載)
2003年11月 EJB 2.1 Final Release(JSR 153)
2003年12月 Fowler が POJO の由来を記事に書く
2004年1月 Fowler の記事で Dependency Injection という名前が付く
2004年3月 Spring Framework 1.0(3月24日)
2006年5月 EJB 3.0 Final Release(JSR 220)

図やコードに出てくる用語(タップで説明)