我是否需要销毁BeanManager.getReference中使用的CreationalContext?

时间:2017-01-19 19:18:42

标签: java-ee cdi

我在CDI中CreationalContextBeanManager.getReference无法理解。

我正在使用Wildfly 8.2.1的CDI 1.2,这是我的问题。

我有一个由第三方库生成的CDI bean。

豆子:

public class ProducedBean
{
   private long m_id;

   public long getId()
   {
      return m_id;
   }
}

而制作人(这只是一个例子):

@Produces
public ProducedBean getBean()
{
   return new ProducedBean();
}

在CDI自定义Scope上下文中,我需要访问此bean。所以我使用BeanManager

final Set<Bean<?>> beans = beanManager.getBeans(ProducedBean.class);
final Bean<?> bean = beanManager.resolve(beans);
CreationalContext<JobContext> creationalContext = beanManager.createCreationalContext(null);
final ProducedBean producedBean = (ProducedBean) beanManager.getReference(bean, ProducedBean.class, creationalContext);
// Get id of ProducedBean
// Then release creationalContext?

我对此代码有2个问题:

1°)创建creationalContext后我是否需要销毁ProducedBean?我读了javadoc,但我不清楚。我只想获得ProducedBean的ID。

2°)使用beanManager.createCreationalContext(null)beanManager.createCreationalContext(bean)会更好吗?就我而言,我只读了ProducedBean的ID。

感谢。

1 个答案:

答案 0 :(得分:2)

首先,你的bean是(我希望故意)@Dependent,它会影响你处理它的方式。对于@Dependent,每次注入都有一个实例,一旦销毁了注入它的上下文bean,它就会被销毁。因此,在您的情况下,您将需要手动处理此问题。

现在,针对您的具体问题:

  1. 无需处理上下文本身。相反,一旦您完成了ProducedBean工作,请返回Bean<ProducedBean>对象,并确保调用其destroy(T instance, CreationalContext<T> creationalContext)方法。同样,您需要这样做,因为您的bean是@Dependent
  2. 您很可能想要使用beanManager.createCreationalContext(bean)。原因是如果您的ProducedBean具有任何(上下文)依赖关系,例如注入其他东西,这将解决注射。对于null,如果我没记错的话,它只适用于非托管实例。