Jakarta ee 是否需要销毁BeanManager.getReference中使用的CreationContext?
CDI中的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自定义范围上
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?