- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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
的地方使用的东西。
Instance.get()
不接受 CreationalContext
参数,而 BM.getReference()
接受。
Instance
时,CreationalContext
由容器管理 - 您无需关心它,尤其是释放上下文。如果您正在使用 BM.getReference()
,您首先需要获取该上下文,这通常意味着创建它,并且您有责任在完成使用后释放它。关于java - CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53048010/
在上述用例中,BeanManager 在单元测试期间不会返回 bean。该项目是一个Java 库。 Bean接口(interface) public interface My { String t
我正在尝试设置一个简单的应用程序,以在 Wildfly 14 上使用 SpringBoot 2.1.1 和 Java 11(因为 Eclipse 不支持 Wildfly 15)。 部署失败,因为 Wi
我有部署到 glassfish 的 .war 应用程序。我想做 CDI,所以我需要从我的 POJO 中查找 java:comp/BeanManager。但它不起作用:根本找不到 BeanManager
我正在尝试将 war 文件部署到 Wildfly 10.0.0.Final 中,部署失败并出现以下错误: "{\"WFLYCTL0080: Failed services\" => {\"jboss.
我在java se上使用weld+paxcdi。我可以使用 beanManager 获取引用 @Inject BeanManager beanManager; 但是,很明显,我只能在由 CDI 容器管
我正在尝试使用 JSF(使用 IntelliJ 的默认“hello world”项目)建立一个基本项目,但我不断收到 javax.faces.FacesException: Unable to fin
我正在工作中测试 Vaadin 14 的概念产品。我已确保安装 NodeJS (V13.3.0) 和 NPM (6.13.1),并将其包含到我的 POM.xml 中> 文件。我目前使用的是 JRE 和
据我所知,每个 osgi 包都有自己的 cdi 容器。所以我有以下情况 - 我有两个 bundle :A 和 B。 bundle 部署在 glassfish4 中。在 bundle A 中,我有 cd
这个问题在这里已经有了答案: Wildfly starts with error. javax.faces.FacesException: Unable to find CDI BeanManage
我已经在本地主机上运行的本地服务器上成功部署了一场 war 。但是,当我将 WAR 部署到我的远程 AWS 实例时,服务器会正确启动,但会在启动几秒钟后取消部署我的 WAR。 启动后,我从 sta
我认为有两种通用方法可以通过 BeanManager 获取自动创建的 CDI 托管 bean 实例。当只有 Bean 时首先(基于 Class 创建): 作者: BeanManager#getRefe
我正在尝试使用 BeanManager 而不是 Instance .select().get() 创建 CDI 托管 bean 的实例。 这被建议作为解决我一直遇到的 ApplicationScope
当尝试部署耳朵时,我们得到了臭名昭著的 WELD-001408(请参阅下面的堆栈跟踪)。 问题:WELD 似乎无法通过 @Inject 将 EJB 注入(inject) lib/shared.jar
运行于: Apache 汤姆猫 7.0.47OmniFaces 1.6.3JSF 莫哈拉 2.1.26CDI Weld 2.1.0.Final 通过访问 JNDI“java:comp/BeanMana
在 JEE/CDI 的上下文中,当我需要从方法中静态检索 CDI 托管 bean 时,我发现自己通常使用 CDI 静态函数。例如: MyBean myBean = CDI.current().sele
我在 eclipse 中使用 WildFly 18,jdk-13.0.1 编写了我的第一个 JSF hello world 程序。 , window 10。 Wildfly home 和管理控制台工作
我在 eclipse 中使用 WildFly 18,jdk-13.0.1 编写了我的第一个 JSF hello world 程序。 , window 10。 Wildfly home 和管理控制台工作
有一个包 A,并且包 A 中有一个类 MyClass。我们假设 pax-cdi+weld 已打开。 我可以在不使用@Inject和其他CDI注释的情况下获取MyClass内bundle A的BeanM
在我的 JSF 应用程序中构建了很多转换器之后,我将注意力转向了 Omnifaces,一切都运行良好。当我部署我的应用程序时出现问题。我第一次访问我的登录页面时,它抛出下一个异常: SEVER
我正在尝试显示来自托管 bean 方法的图像,该方法返回 byte[]与 使用 omnifaces 我在 WEB_INF/lib 中部署了 omnifaces 2.1这是我的代码 注册.java pu
我是一名优秀的程序员,十分优秀!