0

CDI@Namedbeanの名前を持っています。たとえば、「firedEmployeeBean」。

他のCDIBeanで、「firedEmployeeBean」がすでにインスタンス化されているかどうかを確認する方法はありますか?

4

2 に答える 2

4

すでに述べたように、@Inject一度チェックすると使用できます。代わりに必要なのは、必要なものを伝えるためのプロパティを持つことです。

boolean initiated;

この単純な解決策でうまくいかない場合は、Deltaspikeを使用することをお勧めします。

MyBean myBean = BeanProvider.getContextualReference(MyBean.class, true);

2番目の引数trueに注意してください-ドキュメントから:指定されたインターフェイスの実装を探し、実装が不要であるか、指定された修飾子を持つインスタンスが存在する必要がない場合は、2番目の引数としてtrueを渡します(を参照)。詳細については、修飾子の例)。 http://incubator.apache.org/deltaspike/core.html

最後に、イベントを使用できます。イベントはCDIで非常に簡単に使用できます。あなたがする必要があるのは、Beanが作成されたときにイベントを起動し、他のBeanにそのイベントを監視させることです。 http://docs.jboss.org/weld/reference/latest/en-US/html/events.html

于 2013-03-26T09:10:09.047 に答える
1

別の方法として、CDIを使用してBeanManager、特定のコンテキスト内で(またはコンテキストなしで)Beanを手動でプルアップすることができます。JSFコンテキストを例にとると、次のスニペットを使用して、コンテキスト内のすべてのアクティブなインスタンスをプルできMyBeanます。

   public void findBean(String beanName, FacesContext facesContext){
       BeanManager cdiBeanManager = (BeanManager)((ServletContext) facesContext.getExternalContext().getContext()).getAttribute("javax.enterprise.inject.spi.BeanManager"); //get the BeanManager in your operational context
       Bean bean = cdiBeanManager.getBeans(beanName).iterator().next(); //this actually returns a Set, but you're only interested in one
       CreationalContext ctx = cdiBeanManager.createCreationalContext(bean);
       MyBean theActualBean = cdiBeanManager.getReference(bean, bean.getClass(),ctx); //retrieve the bean from the manager by name. You're guaranteed to retrieve only one of the same name within the given context;

   }

これは純粋なJavaEE実装であり、サードパーティのライブラリはありません

于 2013-03-28T15:34:51.717 に答える