![]() ![]() ![]() ![]() |
以下の節では、新しいメタデータ アノテーション プログラミング モデルを使用する EJB の単純な Java サンプルについて説明します。
これらのサンプルを参照して EJB をプログラミングする方法については、このマニュアルの別の節で説明します。
次に、ServiceBean
ステートレス セッション EJB の単純なビジネス インタフェースのコードを示します。
package examples;
/**
* Service ステートレス セッション EJB のビジネス インタフェース
*/
public interface Service {
public void sayHelloFromServiceBean();
}
このコードは、Service
ビジネス インタフェースに、1 つのメソッド sayHelloFromServiceBean()
が含まれていることを示します。このメソッドは、パラメータを取らず、void を返します。
次に、上の Service
インタフェースを実装する Bean ファイルのコードを示します。太字部分については、後ほど解説します。
package examples;
import static javax.ejb.TransactionAttributeType.*;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.interceptor.ExcludeDefaultInterceptors;
/**
* Service ビジネス インタフェースを実装する Bean ファイル。
* 以下の EJB 3.0 アノテーションを使用している。
* - @Stateless - EJB のタイプがステートレス セッションであることを指定する
* - @TransactionAttribute - EJB がトランザクション内で実行されることはな
* いことを指定する
* - @ExcludeDefaultInterceptors - このクラスでは、コンフィグレーション
* されているデフォルト インターセプタを呼び出さないことを指定する
*/
@Stateless
@TransactionAttribute(NEVER)
@ExcludeDefaultInterceptors
public class ServiceBean
implements Service
{
public void sayHelloFromServiceBean() {
System.out.println("Hello From Service Bean!");
}
}
import
文を使用して、Bean ファイルで使用するメタデータ アノテーションをインポートしている。import static javax.ejb.TransactionAttributeType.*;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.interceptor.ExcludeDefaultInterceptors
EJB 3.0 にのみ適用されるアノテーションは、javax.ejb
パッケージに含まれています。他の Java Platform, Enterprise Edition (Java EE) バージョン 5 コンポーネントで使用できるアノテーションは、より一般的なパッケージ (javax.interceptor
、javax.annotation
など) に含まれています。
ServiceBean
Bean ファイルは、Service
ビジネス インタフェースを実装するプレーン Java ファイルで、EJB 固有のインタフェースを実装する必要はない。つまり、Bean ファイルには、2.X プログラミング モデルでは必須だったライフサイクル メソッド (ejbCreate
、ejbPassivate
など) を実装する必要はないということです。@Stateless
メタデータ アノテーションは、EJB のタイプがステートレス セッションであることを指定している。@TransactionAttribute(NEVER)
アノテーションは、EJB がトランザクション内で実行されることはないことを指定している。@ExcludeDefaultInterceptors
アノテーションは、ejb-jar.xml
デプロイメント記述子ファイルでデフォルト インターセプタが定義されている場合でも、この EJB のメソッド呼び出しに対しては、そのデフォルト インターセプタを呼び出さないことを指定している。
次に、AccountBean
ステートフル セッション EJB の単純なビジネス インタフェースのコードを示します。
package examples;
/**
* Account ステートフル セッション 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 static javax.ejb.TransactionAttributeType.*;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.Remote;
import javax.ejb.EJB;
import javax.annotation.PreDestroy;
import javax.interceptor.Interceptors;
import javax.interceptor.ExcludeClassInterceptors;
import javax.interceptor.InvocationContext;
/**
* Account ビジネス インタフェースを実装する Bean ファイル。
* 以下の EJB アノテーションを使用している。
* - @Stateful - ステートフル セッション EJB であることを指定する
* - @TransactionAttribute - この EJB がトランザクション
* 内で実行されることはないことを指定する
* - @Remote - この EJB のリモート インタフェースを指定する
* - @EJB - ServiceBean ステートレス セッション EJB への
* 依存性を指定する
* - @Interceptors - この Bean クラスがインターセプタ クラスに関連付けられており、
* デフォルトでは、すべてのビジネス メソッドが、@AroundInvoke アノテーション
* が付けられているインターセプタ クラス内のメソッドを呼び出すことを指定する
* - @ExcludeClassInterceptors - Bean クラスに対して定義された
* インターセプタ メソッドを、このメソッドに対して実行しないこと
* を指定する
* - @PreDestroy - EJB コンテナが Bean を破棄しようとした
* ときに呼び出されるライフサイクル メソッドを指定する
*
*/
@Stateful
@TransactionAttribute(NEVER)
@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 static javax.ejb.TransactionAttributeType.*;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.Remote;
import javax.ejb.EJB;
import javax.annotation.PreDestroy;
import javax.interceptor.Interceptors;
import javax.interceptor.ExcludeClassInterceptors;
EJB 3.0 にのみ適用されるアノテーションは、javax.ejb
パッケージに含まれています。他の Java Platform, Enterprise Edition (Java EE) バージョン 5 コンポーネントで使用できるアノテーションは、より一般的なパッケージ (javax.interceptor
、javax.annotation
など) に含まれています。
import javax.interceptor.InvocationContext;
AccountBean
Bean ファイルは、Account
ビジネス インタフェースを実装するプレーン Java ファイルで、EJB 固有のインタフェースを実装する必要はない。つまり、Bean ファイルには、2.X プログラミング モデルでは必須だったライフサイクル メソッド (ejbCreate
、ejbPassivate
など) を実装する必要はないということです。@Stateful
メタデータ アノテーションは、EJB のタイプがステートフル セッションであることを指定している。@TransactionAttribute(NEVER)
アノテーションは、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;
/**
* インターセプタ クラス。インターセプタ メソッドには @AroundInvoke アノテーションを
* 付ける
*/
public class AuditInterceptor {
public AuditInterceptor() {}
@AroundInvoke
System.out.println("Invoking method: "+ic.getMethod());
public Object audit(InvocationContext ic) throws Exception {
return ic.proceed();
}
@PostActivate
System.out.println("Invoking method: "+ic.getMethod());
public void postActivate(InvocationContext ic) {
}
@PrePassivate
System.out.println("Invoking method: "+ic.getMethod());
public void prePassivate(InvocationContext ic) {
}
}
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
public AuditInterceptor() {}
@AroundInvoke
は、ビジネス メソッド インターセプタ メソッドを指定している。このアノテーションは、1 つのインターセプタ クラス内で一度だけ使用できます。 @PostActivate
および @PrePassivate
アノテーションは、EJB コンテナが Bean を再アクティブ化した後と Bean をパッシベーションする前に呼び出すメソッドをそれぞれ指定している。 注意 : | これらのライフサイクル コールバック インターセプタ メソッドは、ステートフル セッション Bean にのみ適用されます。 |
セッション Bean からエンティティを呼び出すサンプルについては、配布キットに含まれている EJB 3.0 のサンプルを参照してください。WebLogic Server をインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME
/samples/server/examples/src/examples/ejb/ejb30
WL_HOME
は、WebLogic Server のインストール ディレクトリ (たとえば /bea/wlserver_10.3
) です。
![]() ![]() ![]() |