Enterprise JavaBeans

Enterprise JavaBeans (EJB) とは、JavaBeans仕様と同様のものを、ネットワーク分散型ビジネスアプリケーションのサーバサイドで実現した仕様のこと。セキュリティ機能などを備える。サン・マイクロシステムズ（サン）がJava EE（現・Jakarta EE）仕様の中でビジネスロジックをモデル化およびデータの永続化のために作成した。データベースやアプリケーションサーバなどで実装されている。

歴史 
EJBは元々、OMGのCORBAやサンのRMIといった分散オブジェクトに由来する技術であり、RMIをベースにビジネスロジックを実装するコンポーネントとして誕生した。最初の実装はJavaの誕生から3年後の1998年頃に登場している。こうした経緯から、当初策定されたEJBはリモートアクセスを想定した複雑な実装が必須となっており、デプロイメント記述子と呼ばれるXMLの設定ファイルもかかせないものだった。また、EJB 1.0では主要な要素としてセッションBeanのみが定義されており、エンティティBeanはオプションという扱いであった。2003年のJ2EE 1.4で定義されたEJB 2.0では、EJBが分散オブジェクトとして使われることは稀であるという実情を踏まえ、ローカルインタフェースの追加が行われている。またメッセージ駆動型Beanが仕様に組み込まれた。

しかしEJBの仕様は依然複雑なものであり、EJBに代わってより軽量なSpring FrameworkやPOJOといった考え方を用いる動きが活発化する。こうした流れを受け、2007年のJava EE 5で定義されたEJB 3.0では、DIやPOJOといった考え方を取り入れる形で仕様の全面的な見直しが行われる。EJBの各クラスは単なるPOJOとなり、J2SE 5.0で導入されたアノテーションによりEJBとしての宣言を行う形式とされた。設定ファイルも不要となり、エンティティBeanは独立した永続化フレームワークであるJava Persistence APIに置き換えられた。

その後も改良は続けられており、2009年のJava EE 6で定義されたEJB 3.1では、シングルトンセッションBeanの追加や、セッションBeanを中心とするコンポーネントのみを抽出したEJB Liteと呼ばれるサブセットの定義が行われており、2013年のJava EE 7で定義されたEJB 3.2では、非同期処理のEJB Liteへの導入や不要となったエンティティBeanが仕様から取り除かれるなどしている。

EJBの種類 
EJBは、大きく以下の三つの種類のBeansに分けられる。

セッションBean (Session Bean)
セッションを保持し、一時的なロジックを保存するオブジェクト。以下のような種類がある。
 ステートフルセッションBean (Stateful Session Bean) : クライアントごとの状態 (State) を保持するセッションBean。
 ステートレスセッションBean (Stateless Session Bean) : クライアントごとの状態を保持しないセッションBean。
 シングルトンセッションBean (Singleton Session Bean) : 常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean。
 
メッセージ駆動型Bean (Message Driven Bean)
非同期処理の記述など。

エンティティBean (Entity Bean)
永続的なデータを保存するオブジェクト。EJB 3.2で廃止。

例 
EJBの簡単な例を以下に示す。

@Stateless 
public class CustomerService { 
  
  @PersistenceContext 
  private EntityManager entityManager; 
    
  public void addCustomer(Customer customer) { 
    entityManager.persist(customer); 
  } 
}

上記のコードは、O/Rマッピングを使用して顧客 (Customer) オブジェクトを永続化（DBに保存）するサービスクラス（セッションBean）である。EJBが永続コンテキスト (Persistence context) の管理を行うため、実際にデータを登録するaddCustomer()メソッドは、デフォルトでトランザクション管理されたスレッドセーフなメソッドとなる。上記のコードは、EJBのビジネスロジックと永続化に焦点を当てたもので、EJBの特徴的な機能の数々は使用していない。

こうしたEJBのセッションBeanは、以下のように他のクラスから呼び出して使用することができる。以下はWeb層からの呼び出し例である。

@Named	
@RequestScoped
public class CustomerBacking {
   @EJB 
   private CustomerService customerService;

   public String addCustomer(Customer customer) {
      customerService.addCustomer(customer);
      context.addMessage(...); // （省略）メッセージ出力など
      return "customer_overview";
   }
}

上記のコードは、EJBのセッションBeanを@EJBアノテーションにより注入した、JavaServer Faces (JSF) の管理Bean (Managed Bean) である。今度のaddCustomer()メソッドは、UIコンポーネントにおけるボタン操作などを表現している。EJBのセッションBeanとは逆に、この管理Beanにはビジネスロジックに関するコードも永続化に関するコードも含まれていないが、EJBのコードを呼び出すことでそうした処理を実現している。EJBはプレゼンテーション層に依存せず、それらの役割は管理Beanが担う。

EJBコンテナ 
EJBを管理し、動作させるための実行環境はEJBコンテナと呼ばれる。EJBコンポーネントが動作するときに利用するデータベースへのコネクションやトランザクションの管理も同時に行う。

EJBコンテナの代表例としてJBossなどが挙げられる。またJavaEEサーバーはEJBコンテナを含んでいる。

脚注

関連項目 

 Java Persistence API
 Spring Framework

外部リンク 
 JSR 905: Enterprise JavaBeansTM Specification Version 1.1, Errata Sheet, 5/4/2000 
 JSR 19: Enterprise JavaBeansTM 2.0 
 JSR 153: Enterprise JavaBeansTM 2.1 
 JSR 220: Enterprise JavaBeansTM 3.0 
 JSR 318: Enterprise JavaBeansTM 3.1 

Java
Java specification requests
Java enterprise platform