【发布时间】:2019-04-02 12:47:39
【问题描述】:
在 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);
所以除了使用CDI.current() 方法编写的代码明显减少之外,使用它有什么不同?似乎恢复使用BeanManager 是一种更复杂(并且可能容易出错?)的方法。从功能的角度来看,使用CDI.current() 方法有什么缺点吗? CDI...select() 是否仅适用于 @ApplicationScope bean?或者我也可以与其他作用域 bean 一起使用(例如:@Dependent)吗?
我记得读过一些关于使用 CDI 方法可能发生内存泄漏的文章,但不明白这是如何发生的或为什么会发生这种情况。
【问题讨论】:
标签: java jakarta-ee cdi