gpt4 book ai didi

java - CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否等效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:18 26 4
gpt4 key购买 nike

在 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 方法可能发生内存泄漏的文章,但不明白为什么会出现这种情况。

最佳答案

这两种方法产生相似的结果,但有两个主要差异。

  • CDI.current() 是您可以在不能简单地使用 @Inject BeanManager 的地方使用的东西。
    • 这只是一种从非 cdi 托管对象获取 CDI 实例的方法
  • Instance.get() 不接受 CreationalContext 参数,而 BM.getReference() 接受。
    • 这是至关重要的区别,在使用 Instance 时,CreationalContext 由容器管理 - 您无需关心它,尤其是释放上下文。如果您正在使用 BM.getReference(),您首先需要获取该上下文,这通常意味着创建它,并且您有责任在完成使用后释放它。

关于java - CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53048010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com