Java EE のインターセプターの紹介
- Java EE のインターセプターの紹介
-
Java の
javax.interceptor
パッケージ - Java のインターセプター メソッド
- Java でのインターセプター メソッドとインターセプター クラスの使用
この記事では、Java EE のインターセプターについて紹介します。 これには、インターセプター メソッド、インターセプター クラス、およびライフサイクル コールバック インターセプターが含まれます。
Java EE のインターセプターの紹介
Java EE バージョン 5 では、エンタープライズ JavaBean (EJB
) でのみインターセプターを使用できました。 Java EE バージョン 6 は新しい仕様をもたらしましたが、それはより高いレベルで抽象化されていたため、より一般的に適用することができました。
Java EE バージョン 7 では @Transactional
アノテーションが導入され、Enterprise JavaBeans からコンテナー管理のトランザクションが可能になりました。 これはインターセプタ バインディングとして定義され、Java EE ランタイムによって実装されます。
インターセプタは、ターゲット上でビジネス メソッドが呼び出されたときにメソッドが呼び出されるクラスです。 たとえば、Bean を破棄または作成するメソッドなどのライフサイクル イベントが発生します。
インターセプターを使用して、分野横断的な懸念事項を実装します。 たとえば、ビジネス ロジックからのセキュリティ、監査、ロギングなどです。
インターセプターは、クラス インターセプターまたはメソッド インターセプターとして定義できます。推奨されるアプローチは、メタデータ アノテーションを使用してインターセプターを定義することです。 それらをアプリケーション記述子で定義することもできますが、Java EE サーバー間で移植することはできません。
Java の javax.interceptor
パッケージ
メタデータ アノテーションは javax.interceptor
パッケージにあります。 メタデータ アノテーションの例としては、@AroundTimeout
と @AroundInvoke
があります。
javax.interceptor
パッケージには、インターセプター クラスとメソッドを定義するために使用するすべてのインターフェイスと注釈が含まれており、インターセプター クラスをターゲット クラスにバインドするためにも使用されます。 インターセプターの機能は、Java Interceptor 仕様で定義されています。
インターセプターの仕様では、ライフサイクル コールバック インターセプトとビジネス メソッド インターセプトの 2 種類のインターセプト ポイントが定義されています。 Context and Dependency Injection (CDI
) はこの機能を改善し、インターセプターを Bean にバインドするためのセマンティックおよび注釈ベースのアプローチで改善します。
Java のインターセプター メソッド
ターゲット クラスまたはインターセプタ クラスのメソッドです。 ターゲット クラスのメソッドの呼び出し、およびターゲット クラスのコンストラクターやライフサイクル イベントなどに介入するために呼び出されます。
ターゲットクラスの場合、インターセプターメソッドをターゲットクラス、インターセプタークラス、またはインターセプタークラスまたはターゲットクラスのスーパークラスで宣言できます。 AroundConstruct
は、インターセプター クラスまたはそのスーパークラスで定義できる唯一のメソッドです。
AroundInvoke
、AroundTimeout
、PostConstruct
、および PreDestroy
もインターセプター メソッドです。 PostConstruct
、AroundConstruct
、および PreDestroy
は、まとめてライフサイクル コールバック インターセプター メソッドと呼ばれます。
インターセプター クラス
インターセプター クラスはターゲット クラスとは異なります。 インターセプター クラスのメソッドは、ターゲット クラスでの呼び出しに応答して呼び出されます。ターゲット クラスは、任意の数のインターセプター クラスと関連付けることができます。
インターセプター クラスには、引数のないパブリック コンストラクターが含まれている必要があることに注意してください。 クラスの場合、メタデータ アノテーションを使用してインターセプター クラスとメソッドを定義します。また、デプロイメント記述子を使用してインターセプター クラス/メソッドを定義することもできます。
インターセプタ クラスは、javax.interceptor.Interceptors
アノテーションで定義された順序で呼び出されます。 この順序は固定されておらず、デプロイメント記述子でオーバーライドできることに注意してください。
インターセプターのライフサイクル
インターセプター クラスのライフサイクルは、関連するターゲット クラスと同じです。 ターゲット クラスをインスタンス化すると、インターセプター クラスもインスタンス化されます。これは、ターゲット クラスで宣言するすべてのインターセプター クラスに対して行います。
@PostConstruct
コールバックを呼び出す前に、すべてのインターセプターとターゲット クラスをインスタンス化します。 さらに、@PreDestroy
コールバックを呼び出す前に、インターセプタ ターゲット クラスのインスタンスを破棄します。
Java でのインターセプター メソッドとインターセプター クラスの使用
インターセプターメソッドを使用するには、次のようにメソッドの周りに配置するだけです。 これをインターセプト メソッド インターセプターと呼びます。
@AroundTimeout public void timeoutInterceptorMethod(InvocationContext ctx){...}...
インターセプター クラスの場合、インターセプター アノテーションを追加します。 それらをインターセプタークラスに入れます。
次の例を参照してください。
例:
@Stateless
public class OrderBean {
... @Interceptors(OrderInterceptor.class) public void placeOrder(Order order){...}...
}
これ をチェックして、インターセプターを詳細に調べることができます。