我在CDI中CreationalContext
和BeanManager.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。
感谢。
答案 0 :(得分:2)
首先,你的bean是(我希望故意)@Dependent
,它会影响你处理它的方式。对于@Dependent
,每次注入都有一个实例,一旦销毁了注入它的上下文bean,它就会被销毁。因此,在您的情况下,您将需要手动处理此问题。
现在,针对您的具体问题:
ProducedBean
工作,请返回Bean<ProducedBean>
对象,并确保调用其destroy(T instance, CreationalContext<T> creationalContext)
方法。同样,您需要这样做,因为您的bean是@Dependent
。beanManager.createCreationalContext(bean)
。原因是如果您的ProducedBean
具有任何(上下文)依赖关系,例如注入其他东西,这将解决注射。对于null,如果我没记错的话,它只适用于非托管实例。