CDI 托管 bean 和 JSF 托管 bean 可以相互通信吗?

Posted

技术标签:

【中文标题】CDI 托管 bean 和 JSF 托管 bean 可以相互通信吗?【英文标题】:Can CDI managed beans and JSF managed beans talk to each other? 【发布时间】:2011-12-05 18:14:59 【问题描述】:

我有一个想用 CDI bean 设置的 Tomcat 6 JSF Web 应用程序。不过,我将不得不逐渐将项目转换为 CDI。

我的问题是:CDI bean 和传统的 JSF 托管 bean 可以相互注入吗?

谢谢。

【问题讨论】:

【参考方案1】:

所有 JSF 托管 bean (JMB) 要么自动成为 CDI 托管 bean (CMB),要么可以使用 beans.xml 标记文件来识别。 (CMB 的要求非常低,基本上只指定existence of a non-parameter constructor。)

这意味着您应该能够毫不费力地使用(阅读:注入)所有 JMB。

但是,由于 JMB 使用与 CMB 不同的范围(javax.faces.*javax.enterprise.*),因此会出现问题

最好通过注册一个相对简单的 CDI 扩展来解决这些问题:当 CDI 服务器(对您来说是 Tomcat)启动时,它会引发一些您可以观察到的事件 - 这是您可以检测 JMB 和将它们转换为范围正确的 CMB。

但是在你开始破解之前:所有这些都已经由Seam 3 Faces module 完成了。只需将它放在您的类路径中,所有 JSF 作用域都会桥接到 CDI 作用域。

【讨论】:

有意思,我去看看。谢谢! 是的,看起来 Seam 3 Faces 连接了 JSF 管理的 bean 和 CDI bean。

以上是关于CDI 托管 bean 和 JSF 托管 bean 可以相互通信吗?的主要内容,如果未能解决你的问题,请参考以下文章

JSF-2.3 找不到我的 @Named CDI-1.2 托管 bean

使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean

GlassFish 域中的 JSF 托管 Bean 唯一性

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

Field.get(obj) 在注入的 CDI 托管 bean 上返回所有空值,同时手动调用 getter 返回正确的值

是否有可能在运行时检测CDI托管bean的范围?