2016-07-11 11 views
0

私はEJBのenpointに注入される@TransactionScoped Beanを持っています。例えば私がEJBを介してEJBを呼び出すとJAX-RSエンドポイントでは、Beanの2つのインスタンスが作成されていることがわかります。なぜこの最初のBeanインスタンスが作成されるのか、私は不思議に思っています。それはペナラとワイルドフライで起こっています。2つのCDI @TransactionScoped Beanインスタンスが作成されました。どうして?

@TransactionScoped 
public class TransactionBean implements Serializable { 
    private String data; 
    private static AtomicInteger counter = new AtomicInteger(); 

    public TransactionBean() { 
     this.data = "TransactionBean #" + counter.getAndIncrement() + " created."; 
     System.out.println("Created " + this.data); 

    } 

    public String toString() { 
     return data; 
    } 
} 

は、私が作成した出力

  • TransactionBean#0を参照してください。
  • トランザクションビーン#1が作成されました。

#1インスタンスは、実際のトランザクションで使用されるインスタンスです。なぜこの最初のインスタンスが作成されますか?これらの特定のアプリケーションサーバーでのCDIの実装の詳細なのでしょうか、それとも意図的に起こっていますか?それはあなたが目撃何...ただ好奇心から

乾杯、 ダニエル

+0

ほとんどの場合、プロキシの作成を目撃しています。詳細については、[this](http://stackoverflow.com/questions/18911646/constructor-of-cdi-managed-bean-is-invoked-twice-while-opening-the-page/18911939#18911939)を参照してください。 –

+0

コンストラクタではなく '@ PostConstruct'メソッドを監視する方がよいでしょう。 –

+0

ありがとう!リンクは非常に役立ちます。したがって、本質的には実装に起因します。詳細はプロキシの作成方法です。 @PostConstructのヒントも意味があります。 – 38leinad

答えて

0

である可能性が最も高いプロキシオブジェクトの作成です。

CDI(Wildflyの内部構造を変更した場合を除いて、あなたの場合はWeld)は、基礎となるオブジェクト自体と注入点に送るプロキシを作成します。

この考えを確認するには、@Singleton beanを使用する場所に似たコードを試してみてください。そこでは、コンストラクタは@Singleton does not create a proxy objectとして一度だけ呼び出されるべきです。

関連する問題