インターフェース InterceptionFactory<T>

  • 型パラメーター:
    T - ラッパーが作成される型

    public interface InterceptionFactory<T>
    InterceptionFactory を使用すると、メソッド呼び出しがメソッドインターセプターによってインターセプトされ、提供されたインスタンスに転送されるラッパーインスタンスを作成できます。

    InterceptionFactory の実装は、たとえばカスタム Bean の create メソッドで使用される BeanManager.createInterceptionFactory(CreationalContext, Class) を呼び出すことによって取得できます。

     public class MyCustomBean implements Bean<MyClass> {
    
         BeanManager bm;
    
         public MyBean(BeanManager bm) {
            this.bm = bm;
         }
    
         public MyClass create(CreationalContext<MyClass> creationalContext) {
    
             InterceptionFactory<MyClass> factory = bm.createInterceptionFactory(creationalContext, MyClass.class);
    
             factory.configure().filterMethods(m -> m.getJavaMember().getName().equals("shouldBeTransactional")).findFirst()
                     .ifPresent(m -> m.add(new AnnotationLiteral<Transactional>() {
                     }));
    
             return factory.createInterceptedInstance(new MyClass());
         }
     }
     

    コンテナーは、プロデューサーメソッドパラメーターに注入できるスコープ Dependent、Bean 型 InterceptionFactory、修飾子 Default を備えた組み込み Bean も提供する必要があります。

     @Produces
     @RequestScoped
     public MyClass produceMyClass(InterceptionFactory<MyClass> factory) {
         factory.configure().add(new AnnotationLiteral<Transactional>() {
         });
         return factory.createInterceptedInstance(new MyClass());
     }
     

    このクラスのインスタンスは、再利用もスレッド間の共有にも適していません。

    InterceptionFactory のサポートを提供するために、CDI Lite の実装は必要ありません。

    導入:
    2.0
    作成者:
    Antoine Sabot-Durand
    • メソッドの詳細

      • ignoreFinalMethods

        InterceptionFactory<T> ignoreFinalMethods()
        createInterceptedInstance(Object) の呼び出し中にインターセプトされたインスタンスの型階層のクラスによって宣言された public、protected、default の可視性を持つすべての非静的な final メソッドを無視するようにコンテナーに指示します。

        無視されたメソッドは、createInterceptedInstance(Object) によって作成されたラッパーインスタンスで呼び出されるべきではありません。そうしないと、予期しない動作が発生します。

        戻り値:
        自己
      • createInterceptedInstance

        T createInterceptedInstance​(T instance)
        メソッド呼び出しがメソッドインターセプターによってインターセプトされ、指定されたインスタンスに転送されるラッパーインスタンスを返します。

        このメソッドは 1 回だけ呼び出す必要があります。その後の呼び出しでは IllegalStateExceptionSE がスローされます。

        T が仕様のセクション 3.11 で定義されているようにプロキシできない場合、UnproxyableResolutionException 例外がスローされます。このメソッドの前に ignoreFinalMethods() を呼び出すと、これらの制限が緩和されます。

        提供されたインスタンスが内部クライアントコンストラクト(クライアントプロキシなど)である場合、移植性のない動作が発生します。

        パラメーター:
        instance - 提供されたインスタンス
        戻り値:
        ラッパーインスタンス