CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否等效?
2022-09-04 20:50:54
在 JEE/CDI 的上下文中,当我需要从方法静态检索 CDI 托管 Bean 时,我发现自己通常使用 CDI 静态函数。例如:
MyBean myBean = CDI.current().select( MyBean.class ).get()
但是,据我所知,另一种等效的实现方法是使用BeanManager:
BeanManger bm = new InitialContext().lookup( "java:comp/BeanManager" );
Bean<?> bean = bm.resolve(bm.getBeans( MyBean.class ) );
CreationalContext<?> context = bm.createCreationalContext(bean);
MyBean myBean = bm.getReference(bean, cls, context);
那么,除了使用该方法编写的代码明显减少之外,使用它还有什么区别呢?似乎恢复使用 是一种更复杂(并且可能容易出错?)的方法。从功能的角度来看,使用这种方法有什么缺点吗?只对豆子有用吗?或者我也可以与其他作用域内的bean(例如:)一起使用吗?CDI.current()
BeanManager
CDI.current()
CDI...select()
@ApplicationScope
@Dependent
我记得使用CDI方法阅读了一些关于潜在内存泄漏的内容,但不了解这种情况是如何或为什么会这样。