Jakarta ee 是否需要销毁BeanManager.getReference中使用的CreationContext?

Jakarta ee 是否需要销毁BeanManager.getReference中使用的CreationContext?,jakarta-ee,cdi,Jakarta Ee,Cdi,CDI中的CreationalContext和BeanManager.getReference有一些我不理解的地方 我在Wildfly 8.2.1中使用CDI 1.2,这是我的问题 我有一个CDIBean,它是由第三方库生成的 豆子: public class ProducedBean { private long m_id; public long getId() { return m_id; } } 还有制作人(这只是一个例子): 在CDI自定义范围上

CDI中的
CreationalContext
BeanManager.getReference
有一些我不理解的地方

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

我有一个CDIBean,它是由第三方库生成的

豆子:

public class ProducedBean
{
   private long m_id;

   public long getId()
   {
      return m_id;
   }
}
还有制作人(这只是一个例子):

在CDI自定义范围上下文中,我需要访问这个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?
final Set bean=beanManager.resolve(bean);
CreationContext CreationContext=beanManager.CreateCreationContext(null);
final ProducedBean ProducedBean=(ProducedBean)beanManager.getReference(bean,ProducedBean.class,creationalContext);
//获取ProducedBean的id
//然后释放CreationContext?
关于此代码,我有两个问题:

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

2°)使用
beanManager.createCreationContext(null)
beanManager.createCreationContext(bean)
更好吗?在我的例子中,我只是读取
ProducedBean
的id


谢谢。

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

现在,请回答以下具体问题:

  • 不需要处理上下文本身。相反,一旦使用完
    ProducedBean
    后,返回
    Bean
    对象,确保调用其
    destroy(T实例,CreationalContext CreationalContext)
    方法。同样,您需要这样做,因为您的bean是依赖的
  • 您很可能希望使用
    beanManager.createCreationContext(bean)
    。原因是,如果您的
    ProducedBean
    具有任何(上下文)依赖项,例如注入其他内容,这将解决注入问题。对于null,只有在正确调用的情况下,它才适用于非托管实例

  • 作为记录,使用WildFly 10时,您(默认)使用的是CDI 1.2。实际上是WildFly 8,我将更正我的帖子。谢谢你的回答,非常清楚。对于第2点,我知道如何生成
    ProducedBean
    ,为什么不使用
    beanManager.createCreationContext(null)
    而不是
    beanManager.createCreationContext(bean)
    ?我的意思是我知道,
    ProducedBean
    没有任何注入bean,所以没有必要解决任何注入,不是吗?你的问题并不意味着没有上下文依赖关系。如果是这样的话,我想用
    null
    调用该方法也可以。好的,谢谢。是的,我最初的帖子并不是很清楚制作人得到了什么回报。对不起。但是,我在另一个bean上使用
    beanManager.createCreationContext(null)
    进行了测试,该bean已注入依赖项,并且这些依赖项已正确注入。因此,我仍然不明白在哪种情况下,
    beanManager.createCreationContext(null)
    用于。无论如何,谢谢你的帮助!:-)
    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?