2016-06-23 4 views
1

私は@ Singletonでマークされたクラスを持っています。beanManager.getReference()はスレッドセーフですか?

私は次のコードを使用し、そのクラスのインスタンスを取得するには:、

public Object getMySingleton(Class someClass){ 
    Bean bean = (Bean) beanManager.getBeans(someClass).iterator().next(); 
    CreationalContext ctx = beanManager.createCreationalContext(bean); 
    Object obj =beanManager.getReference(bean, someClass, ctx); 
    return obj; 
} 

くださいgetMySingletonが​​ではありません注意を払います。このコードはスレッドセーフですか?つまり、getMySingletonを別のスレッドから呼び出すことができます - すべての呼び出し元に同じSingletonのインスタンスを渡しますか?

javaeeサーバーとして私はglassfishを使用し、cdiコンテナとして溶接します。しかし、私はjava-eeの仕様に従って共通の答えを得たいと思います。

答えて

1

はい、そうです。

getReference()は実際にproxyインスタンスを返し、実際のインスタンスに委譲します。それは大体架空SomeBeanクラスに対して次のようになります。

public SomeBeanCDIProxy extends SomeBean implements Serializable { 

    public String getSomeProperty() { 
     SomeBean instance = CDI.resolveItSomehow(); 
     return instance.getSomeProperty(); 
    } 

    public void setSomeProperty(String someProperty) { 
     SomeBean instance = CDI.resolveItSomehow(); 
     instance.setSomeProperty(someProperty); 
    } 

} 

実際のインスタンスは、必ずしもプロキシインスタンスが作成され、返された瞬間に作成され、使用できません。プロキシ上のBeanメソッドの1つを呼び出し、実際のインスタンスがそのスコープ内で使用できない場合にのみ、CDIは実際のインスタンスを作成し、メソッド呼び出しをそのインスタンスに委譲します。プロキシの取得方法(手動または注入)にかかわらず、実際のインスタンスはスレッドセーフな方法で論理的に作成されます。さもなければ、注射のために働いていないでしょう。

関連する問題