0

我有一个 CDI @Named bean 的名称。例如,'firedEmployeeBean'。

在其他 CDI bean 中是否有任何方法检查“firedEmployeeBean”是否已经实例化?

4

2 回答 2

4

如前所述,如果您使用@Inject一次检查将是。相反,您想要的是拥有一个属性来告诉您您想要什么:

boolean initiated;

如果这个简单的解决方案不能解决它,我建议使用 Deltaspike:

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

请注意第二个参数 true - 来自文档:如果您查找给定接口的实现并且不需要实现或者不需要存在具有给定限定符的实例,则将 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

作为替代方案,您可以使用 CDIBeanManager在给定上下文(或根本没有上下文)中手动提取 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;

   }

这是一个纯 Java EE 实现,没有第三方库

于 2013-03-28T15:34:51.717 回答