サンプルコードで身につける: EJB が要求したものと Spring の登場
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1EJB 2.1 のセッション Bean に必要だったもの
2.1 仕様(2003年11月)の 7.11 節が、部品を提供する人の責任として挙げているものを表にしました。は必ず2つ1組で、片方だけでは認められません。リモートから呼べる部品1つには、1つとインターフェース2つに加えて、それらを記述する XML()が要ります。
用意するもの | いつ必要か-----------------------------------+------------------------------------------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 以外を継承せず、インターフェースも実装していないことをで表示しています。
4EJB 3.0 の仕様が自分で外したもの
EJB 3.0 Simplified API(2006年5月)が、目標と簡素化の内容として挙げている文を、2.1 の要求と並べました。外した側の言葉で読むと、何が負担と見なされていたかが分かります。3.0 はの仕組みも仕様に取り入れ、2.1 の API も使えるまま残しました。
ホームインターフェース→ Elimination of the requirement for home interfaces for session beans.EJBObject を継承したインターフェース→ The required business interface for a session bean can be a plain Java interfacerather than an EJBObject, EJBLocalObject, or java.rmi.Remote interface.Bean クラスによる javax.ejb の型の実装→ elimination of the requirements for enterprise beans to implement thejavax.ejb.EnterpriseBean interfaces.デプロイ記述子→ Introduction of Java metadata annotations to be used as an alternative todeployment 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)