7.11. Seam インターセプタ
EJB3 ではセッション Bean コンポーネントに標準的なインターセプタモデルが導入されました。 Bean にインターセプタを追加するには、
@AroundInvoke というアノテーションが付加されたメソッドを持つクラスを記述して、 その Bean にインターセプタのクラス名を指定する @Interceptors のアノテーションを付ける必要があります。 たとえば、 次のインターセプタはアクションリスナーメソッドの呼び出しを許可する前にユーザーがログインされたかを確認します。
このインターセプタをアクションリスナーとして動作するセッション Bean に適用するには、 そのセッション Bean
@Interceptors(LoggedInInterceptor.class) というアノテーションを付加しなければなりません。 ただし、 Seam はクラスレベルのインターセプタ (@Target(TYPE) アノテーションが付与されたもの) 用にメタアノテーションとして @Interceptors を使えるようにすることで、EJB3 でのインターセプタフレームワーク上に構築されます。 以下の例では、 @LoggedIn アノテーションを生成します。
@Target(TYPE)
@Retention(RUNTIME)
@Interceptors(LoggedInInterceptor.class)
public @interface LoggedIn {}
@Target(TYPE)
@Retention(RUNTIME)
@Interceptors(LoggedInInterceptor.class)
public @interface LoggedIn {}
これでアクションリスナー Bean に
@LoggedIn アノテーションを付与しインターセプタを適用することができます。
インターセプタの順番が重要な場合、インターセプタクラスに
@Interceptor アノテーションを追加してインターセプタの特定の順序を指定します。
組み込み EJB3 の機能に対してクライアント側インターセプタを持たせることもできます。
@Interceptor(type=CLIENT)
public class LoggedInInterceptor {
...
}
@Interceptor(type=CLIENT)
public class LoggedInInterceptor {
...
}
EJB インターセプタはステートフルとなるため、 そのライフサイクルはインターセプトするコンポーネントのそれと一致します。 状態を維持する必要がないインターセプタの場合、 Seam によりパフォーマンスの最適化が実現し、
@Interceptor(stateless=true) が指定されます。
Seam の多くの機能は、前の例で登場したようなインターセプタを含み、組み込みの Seam インターセプタ郡の 1 セットとして実装されます。 これらのインターセプタはインターセプト可能なすべての Seam コンポーネントに対し存在しているため、アノテーションを使って明示的にインターセプタを指定する必要はありません。
Seam のインターセプタは JavaBean コンポーネントと併用することもできます。
EJB はインターセプタを (
@AroundInvoke を使った) ビジネスメソッドだけでなく、ライフサイクルメソッドの @PostConstruct、 @PreDestroy、 @PrePassivate そして @PostActive に対しても定義します。Seam はコンポーネントおよびインターセプタの両方でこれらのライフサイクルのメソッドを EJB3 Bean のみならず JavaBean コンポーネントに対してもサポートします (JavaBean コンポーネントにとって意味のない @PreDestroy は除きます)。