3 Enterprise JavaBeansの単純なサンプル
この章の内容は次のとおりです:
EJB 3.xの単純なJavaサンプル
次の項では、新しいメタデータ・アノテーション・プログラミング・モデルを使用するEJBの単純なJavaサンプルについて説明します。このガイド内のEJBをプログラミングする方法について説明しているいくつかの項では、これらのサンプルを参照する場合があります。
インタフェースなしの単純なステートレスEJBのサンプル
EJB 3.1のインタフェースなしのローカル・クライアント・ビュー・タイプでは、個別のローカル・ビジネス・インタフェースを必要とすることなく、ローカル・セッションBeanへのアクセスを提供して、コンポーネントでEJB Beanクラス・インスタンスを直接注入させることで、EJBの開発を単純化しています。
次に、ServiceBean
ステートレス・セッションEJBのインタフェースなしの単純なビューのコードを示します。
package examples; @Stateless public class ServiceBean { public void sayHelloFromServiceBean() { System.out.println("Hello From Service Bean!"); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
-
このビュー以外にクライアント・ビューが公開されておらず、Beanクラスのimplements句が記述されていないので、EJBはこのインタフェースなしのビューを自動的に公開します。
-
ServiceBean
Beanファイルは、プレーンJavaファイルであるため、EJB固有のインタフェースを実装する必要はありません。 -
クラス・レベルの
@Stateless
メタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。
単純なビジネス・インタフェースを使用するステートレスEJBのサンプル
次に、ServiceBean
ステートレス・セッションEJBの単純なビジネス・インタフェースのコードを示します。
package examples; /** * Business interface of the Service stateless session EJB */ public interface Service { public void sayHelloFromServiceBean(); }
このコードは、Service
ビジネス・インタフェースに、1つのメソッドsayHelloFromServiceBean()
が含まれていることを示します。このメソッドは、パラメータを取らず、voidを返します。
次に、上のService
インタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。
package examples; import javax.ejb.Stateless; import javax.interceptor.ExcludeDefaultInterceptors; /** * Bean file that implements the Service business interface. * Class uses following EJB 3.x annotations: * - @Stateless - specifies that the EJB is of type stateless session * - @ExcludeDefaultInterceptors - specifies any configured default * interceptors should not be invoked for this class */ @Stateless @ExcludeDefaultInterceptors public class ServiceBean implements Service { public void sayHelloFromServiceBean() { System.out.println("Hello From Service Bean!"); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
-
標準の
import
文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。import javax.ejb.Stateless; import javax.interceptor.ExcludeDefaultInterceptors
EJB 3.1にのみ適用されるアノテーションは、
javax.ejb
パッケージに含まれています。他のJava EEバージョン6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptor
、javax.annotation
など)に含まれています。 -
ServiceBean
Beanファイルは、Service
ビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreate
、ejbPassivate
など)を実装する必要はないということです。 -
クラス・レベルの
@Stateless
メタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。 -
クラス・レベルの
@ExcludeDefaultInterceptors
アノテーションは、ejb-jar.xml
デプロイメント記述子ファイルでデフォルト・インターセプタが定義されている場合でも、このEJBのメソッド呼出しに対しては、そのデフォルト・インターセプタを呼び出さないことを指定しています。
単純なステートフルEJBのサンプル
次に、AccountBean
ステートフル・セッションEJBの単純なビジネス・インタフェースのコードを示します。
package examples; /** * Business interface for the Account stateful session EJB. */ public interface Account { public void deposit(int amount); public void withdraw(int amount); public void sayHelloFromAccountBean(); }
このコードは、Account
ビジネス・インタフェースに3つのメソッド(deposit
、withdraw
、およびsayHelloFromAccountBean
)が含まれていることを示します。
次に、上のAccount
インタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。
package examples; import javax.ejb.Stateful; import javax.ejb.Remote; import javax.ejb.EJB; import javax.annotation.PreDestroy; import javax.interceptor.Interceptors; import javax.interceptor.ExcludeClassInterceptors; /** * Bean file that implements the Account business interface. * Uses the following EJB annotations: * - @Stateful: specifies that this is a stateful session EJB * - @Remote - specifies the Remote interface for this EJB * - @EJB - specifies a dependency on the ServiceBean stateless * session ejb * - @Interceptors - Specifies that the bean file is associated with an * Interceptor class; by default all business methods invoke the * method in the interceptor class annotated with @AroundInvoke. * - @ExcludeClassInterceptors - Specifies that the interceptor methods * defined for the bean class should NOT fire for the annotated * method. * - @PreDestroy - Specifies lifecycle method that is invoked when the * bean is about to be destoryed by EJB container. * */ @Stateful @Remote({examples.Account.class}) @Interceptors({examples.AuditInterceptor.class}) public class AccountBean implements Account { private int balance = 0; @EJB(beanName="ServiceBean") private Service service; public void deposit(int amount) { balance += amount; System.out.println("deposited: "+amount+" balance: "+balance); } public void withdraw(int amount) { balance -= amount; System.out.println("withdrew: "+amount+" balance: "+balance); } @ExcludeClassInterceptors public void sayHelloFromAccountBean() { service.sayHelloFromServiceBean(); } @PreDestroy public void preDestroy() { System.out.println("Invoking method: preDestroy()"); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
-
標準の
import
文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。import javax.ejb.Stateful; import javax.ejb.Remote; import javax.ejb.EJB; import javax.annotation.PreDestroy; import javax.interceptor.Interceptors; import javax.interceptor.ExcludeClassInterceptors;
EJB 3.1にのみ適用されるアノテーションは、
javax.ejb
パッケージに含まれています。他のJava EE 6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptor
、javax.annotation
など)に含まれています。 -
AccountBean
Beanファイルは、Account
ビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreate
、ejbPassivate
など)を実装する必要はないということです。 -
クラス・レベルの
@Stateful
メタデータ・アノテーションは、EJBのタイプがステートフル・セッションであることを指定しています。 -
クラス・レベルの
@Remote
アノテーションは、EJBのリモート・インタフェースの名前(ここでは、ビジネス・インタフェースと同じAccount
)を指定しています。 -
クラス・レベルの
@Interceptors({examples.AuditInterceptor.class})
アノテーションは、Beanファイルに関連付けるインターセプタ・クラスを指定しています。通常、このクラスには、ビジネス・メソッド・インターセプタ・メソッドとライフサイクル・コールバック・インターセプタ・メソッドが含まれます。このクラスの詳細については、「インターセプタ・クラスのサンプル」を参照してください。 -
フィールド・レベルの
@EJB
アノテーションは、アノテーション変数service
に、依存先であるServiceBean
ステートレス・セッションBeanのコンテキストを注入することを指定しています。注入されるフィールドのデータ型はService
です。これは、ServiceBean
EJBのビジネス・インタフェースです。sayHelloFromAccountBean
メソッド内の次のコードは、依存先であるServiceBean
のsayHelloFromServiceBean
メソッドを呼び出す方法を示しています。service.sayHelloFromServiceBean();
-
メソッド・レベルの
@ExcludeClassInterceptors
アノテーションは、sayHelloFromAccountBean
メソッドに対しては、関連付けられているインターセプタ・クラス(AuditInterceptor
)で指定されている@AroundInvoke
メソッドを呼び出さないことを指定しています。 -
メソッド・レベルの
@PreDestroy
アノテーションは、EJBコンテナがAccountBean
のインスタンスを破棄する前にpreDestroy
メソッドを呼び出すことを指定しています。ビジネス・メソッドおよびライフサイクル・コールバックのインターセプタ・メソッドは、インターセプタ・クラスを関連付ける方法だけでなく、このようにBeanファイル自体の中で指定することもできます。
インターセプタ・クラスのサンプル
次に、インターセプタ・クラスのサンプル・コードを示します。このAuditInterceptor
クラスは、上のサンプルで示したAccountBean
ステートフル・セッションBeanから@Interceptors({examples.AuditInterceptor.class})
アノテーションで参照しているインターセプタ・クラスです。太字部分については、後ほど解説します。
package examples; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; import javax.ejb.PostActivate; import javax.ejb.PrePassivate; /** * Interceptor class. The interceptor method is annotated with the * @AroundInvoke annotation. */ public class AuditInterceptor { public AuditInterceptor() {} @AroundInvoke public Object audit(InvocationContext ic) throws Exception { System.out.println("Invoking method: "+ic.getMethod()); return ic.proceed(); } @PostActivate public void postActivate(InvocationContext ic) { System.out.println("Invoking method: "+ic.getMethod()); } @PrePassivate public void prePassivate(InvocationContext ic) { System.out.println("Invoking method: "+ic.getMethod()); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
-
これまでのサンプルと同様に、ファイル内で使用するメタデータ・アノテーションをインポートしています。
import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; import javax.ejb.PostActivate; import javax.ejb.PrePassivate;
-
インターセプタ・クラスはプレーンJavaクラスです。
-
このクラスには、次のような空のコンストラクタが含まれています。
public AuditInterceptor() {}
-
メソッド・レベルの
@AroundInvoke
は、ビジネス・メソッド・インターセプタ・メソッドを指定しています。このアノテーションは、1つのインターセプタ・クラス内で一度だけ使用できます。 -
メソッド・レベルの
@PostActivate
および@PrePassivate
アノテーションは、EJBコンテナがBeanを再アクティブ化した後とBeanをパッシブ化する前に呼び出すメソッドをそれぞれ指定しています。ノート:
これらのライフサイクル・コールバック・インターセプタ・メソッドは、ステートフル・セッションBeanにのみ適用されます。
WebLogic Serverでパッケージ化されたEJB 3.2のサンプル
次の項では、Oracle WebLogic Serverに付属するパッケージ化されたJava EE 7のサンプル(EJB 3.2の新機能のデモ)について説明します。
EJB 3.2: セッションBeanライフサイクルを使用するサンプル
このサンプルは、@AroundConstruct
および@AroundInvoke
を含む、新しいセッションBeanライフサイクル・コールバック・インターセプタ・メソッドAPIを示します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee7/ejb/lifecylce
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.2: メソッドのないリスナーを使用するメッセージドリブンBeanのサンプル
このサンプルは、メソッドのないリスナー・インタフェースを実装するメッセージドリブンBeanを示します。メソッドのないインタフェースを実装するBeanは、java.lang.Object
を除き、メッセージ・リスナー・メソッドとして、Beanクラスおよびスーパークラスのすべての非静的パブリック・メソッドを公開します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee7/ejb/no-method-listener
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
WebLogic Serverでパッケージ化されたEJB 3.1のサンプル
次の項では、Oracle WebLogic Serverに付属するパッケージ化されたJava EE 6のサンプル(EJB 3.1の新機能のデモ)について説明します。
EJB 3.1: シングルトン・セッションBeanのサンプル
このサンプルは、EJB 3.1シングルトン・セッションBeanの使用方法を示しています。これはアプリケーション開発者に、特定のJava仮想マシン(JVM)のアプリケーションで、セッションBeanが一度インスタンス化されることが保証される正式なプログラミング構造を提供します。このサンプルで、@Singleton
セッションBeanは、中央カウンタ・サービスを提供します。カウンタEJBは、Javaクライアントから呼び出され、それが使用されていることを示します。クライアントが複数回呼び出されると、カウントはそのたびに1ずつ増分されます。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/singletonBean
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.1: 非同期メソッドEJBのサンプル
このサンプルは、EJB 3.1の非同期メソッドの呼出しの使用方法について示します。@Asynchronous
アノテーションをEJBクラスまたは特定のメソッドに追加すると、メソッドが呼び出されたときに、クライアントに即座に制御を戻すようにEJBコンテナに指示します。メソッドはFutureオブジェクトを返し、これによりクライアントはメソッド呼出しのステータスをチェックして、非同期に生成される結果の値を取得できます。
このサンプルでは、@Stateless
Beanはクラス・レベルでアノテーションが付けられます。@Asynchronous
はそのメソッドがすべて非同期であることを示し、それぞれのメソッドで長時間の計算をシミュレートします。サーブレットを使用して様々な非同期メソッドをコールし、呼び出しと完了回数を追跡して、メソッド・コールの非同期の動作を示します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/asyncMethodOfEJB
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.1: カレンダベース・タイマーEJBのサンプル
このサンプルは、EJB 3.1の豊富なスケジューリング機能を示しています。このスケジューリング機能は、EJBメソッドに配置できるCRONスタイルのスケジュール定義という形式をとり、定義されたスケジュールに応じてメソッドが自動的に呼び出されます。このサンプルは、メソッドがコールされたときのタイムスタンプを生成して保存する、@Singleton
セッションBeanのメソッド用に定義された@Schedule
アノテーションの使用方法を示しています。対応するサーブレットが提供され、その中にTimerBean
が注入されて、ブラウザに表示されるタイムスタンプのリストが取得されます。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/calendarStyledTimer
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.1: 単純化されたインタフェースなしのプログラミングおよびWARファイルでのパッケージ化
このサンプルは、EJB 3.1で提供された単純化されたプログラミングおよびパッケージ化モデルの変更を示しています。前のバージョンではJavaインタフェースを使用する必要がありましたが、EJB 3.1ではその必要性がなくなったので、古いプレーンJavaオブジェクトにアノテーションを付けてEJBコンポーネントとして使用できます。EJBコンポーネントを直接Webアプリケーションの中に配置する機能によりさらに単純化が進んだので、WebコンポーネントとEJBコンポーネントを保存するアーカイブを生成して、それらをともにエンタープライズ・アーカイブ(EAR)ファイルに組み込む必要がなくなりました。
このサンプルでは、@Stateless
アノテーションを古いプレーンJavaクラスに指定し、これをEJBセッションBeanとして公開します。これはさらに、@EJB
アノテーションを使用して@WebServlet
クラスに注入されることで、それがEJBモジュールとして使用されていることが示されます。EJBセッションBeanとサーブレット・クラスは、ともに単一のWARファイルにパッケージ化されてデプロイメントされます。これにより、Java EE 6で使用できる単純化されたパッケージおよびデプロイメントの変更について説明します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/noInterfaceViewInWAR
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.1: EJBでポータブル・グローバルJNDI名を使用するサンプル
このサンプルは、EJB 3.1で使用可能な、ポータブル・グローバルJNDIネーミング・オプションの使用方法を示しています。ポータブル・グローバルJNDIでは、一般的でよく知られているネームスペースを多数提供し、そのネームスペースでjava:global[/<アプリケーション名>]/<モジュール名>/<Bean名>
というパターンを使用して、EJBコンポーネントを登録およびルックアップできます。これにより、EJBコンポーネントをJNDIに登録する方法および場所、およびそれらをアプリケーションでルックアップおよび使用する方法を標準化します。このサンプルでは、サーブレットでポータブルJNDI名java:module/HelloBean
を使用してEJBセッションBeanをルックアップします。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/portableGlobalJNDIName
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.1: Java SEで組込み可能なEJBコンテナを使用するサンプル
このサンプルは、EJB 3.1で使用可能な組込み可能なEJBコンテナを使用することで、クライアント・コードとそれに対応するエンタープライズBeanをJava EEサーバーにデプロイしなくてもJava SE環境で実行できるようにする方法を示しています。
このサンプルでは、組込み可能なWebLogic EJBコンテナを使用して、Java SE環境から呼び出されるすべてのユーザー・オブジェクトを表示します。アノテーション@Startup
および@PostConstruct
を使用してアプリケーションを起動すると、シングルトン・コンポーネントInitBean
の即時初期化時にすべてのユーザー・オブジェクトが事前定義されます。EJBContainer
のインスタンスがJavaクライアントUserClient
で作成され、セッションBean参照UserBean
をルックアップし、アプリケーションでビジネス・メソッドviewUsers
を呼び出します。
サンプルの実行後、クライアント・クラスが自動的に実行され、サンプルが作成されたコマンド・シェルに実行時メッセージが出力されます。すべての既存のユーザー・オブジェクトがサンプル・データベースから取得され、コマンド・シェルにその詳細が表示されます。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/javaee6/ejb/embeddableContainer
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
EJB 3.0: セッションBeanからエンティティを呼び出すサンプル
セッションBeanからエンティティを呼び出すサンプルについては、配布キットに含まれているEJB 3.0のサンプルを参照してください。WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
EXAMPLES_HOME/examples/src/examples/ejb/ejb30
EXAMPLES_HOME
は、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。