| 
      
 
以下の節では、新しいメタデータ アノテーション プログラミング モデルを使用する 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() {}@AroundInvokeSystem.out.println("Invoking method: "+ic.getMethod());
public Object audit(InvocationContext ic) throws Exception {
return ic.proceed();
}
@PostActivateSystem.out.println("Invoking method: "+ic.getMethod());
public void postActivate(InvocationContext ic) {
}
@PrePassivateSystem.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) です。
    
         |