Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI。如何检查bean是否实例化?_Java_Cdi - Fatal编程技术网

Java CDI。如何检查bean是否实例化?

Java CDI。如何检查bean是否实例化?,java,cdi,Java,Cdi,我有一个名字叫CDI@namedbean。例如,“FiredeEmployeeBean” 在其他CDIBean中是否有任何方法可以检查“firedEmployeeBean”是否已经实例化?如前所述,如果您使用@Inject一旦检查它就会被实例化。相反,您想要的是有一个属性来告诉您您想要什么: boolean initiated; 如果这个简单的解决方案不能解决问题,我建议使用Deltaspike: MyBean myBean = BeanProvider.getContextualRefere

我有一个名字叫CDI@namedbean。例如,“FiredeEmployeeBean”


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

如前所述,如果您使用
@Inject
一旦检查它就会被实例化。相反,您想要的是有一个属性来告诉您您想要什么:

boolean initiated;
如果这个简单的解决方案不能解决问题,我建议使用Deltaspike:

MyBean myBean = BeanProvider.getContextualReference(MyBean.class, true);
注意第二个参数true-from docs:Pass true作为第二个参数,如果您查找给定接口的实现,并且不需要实现,或者不需要存在具有给定限定符的实例(有关更多详细信息,请参阅限定符示例)

最后,您可以使用事件。事件在CDI中使用起来非常简单。您需要做的是在创建bean时触发事件,并让另一个bean观察该事件。

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

boolean initiated;
如果这个简单的解决方案不能解决问题,我建议使用Deltaspike:

MyBean myBean = BeanProvider.getContextualReference(MyBean.class, true);
注意第二个参数true-from docs:Pass true作为第二个参数,如果您查找给定接口的实现,并且不需要实现,或者不需要存在具有给定限定符的实例(有关更多详细信息,请参阅限定符示例)

最后,您可以使用事件。事件在CDI中使用起来非常简单。您需要做的是在创建bean时触发事件,并让另一个bean观察该事件。

作为一种替代方法,您可以使用CDI在给定上下文(或根本没有上下文)中手动提取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实现,没有第三方libs作为替代,您可以使用CDI在给定上下文(或者根本没有上下文)中手动提取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实现,没有第三方libs

它更像量子物理-一旦你检查它就会被实例化:)这一切都取决于你的注入器。@kostja OMG这是薛定谔豆XD它更像量子物理-一旦你检查它就会被实例化:)这一切都取决于你的注入器。@kostja OMG这是薛定谔豆XD旁注:如果要对
FiredeEmployeeBean
的初始化做出反应,可以添加
@PostConstruct
带注释的方法。在
firedEmployeeBean
中执行所有注入后,将调用此方法。另请注意:如果要对
firedEmployeeBean
的初始化作出反应,可以添加
@PostConstruct
注释方法。在
firedEmployeeBean
中执行所有注入后,将调用此方法。