除非显式注释,否则不会发现 CDI bean

Posted

技术标签:

【中文标题】除非显式注释,否则不会发现 CDI bean【英文标题】:CDI bean doesn’t get discovered unless explicitly annotated 【发布时间】:2015-06-14 13:46:58 【问题描述】:

当 bean 是 POJO 时 Weld 说“不满足类型 Foo 的依赖”是什么意思,但是,只要我在顶部添加 @Dependent,一切正常吗? 我记得它曾经在不指定范围的情况下正常工作。我想我弄坏了一些东西。

规格说明:

托管 bean 由称为其 bean 类的 Java 类实现。如果*** Java 类被任何其他 Java EE 技术规范(例如 JavaServer Faces 技术规范)定义为托管 bean,或者满足以下所有条件,则它是托管 bean。

它不是一个非静态内部类。

它是一个具体的类或被@Decorator注解。

它没有使用定义 EJB 组件的注释进行注释,也没有在 ejb-jar.xml 中声明为 EJB bean 类。

它有一个合适的构造函数。即以下情况之一。

该类有一个没有参数的构造函数。

该类声明了一个带有 @Inject 注释的构造函数。

定义托管 bean 不需要特殊声明,例如注解。

【问题讨论】:

您引用的是哪个规范?托管 bean 还是 CDI?有区别。 有什么区别? 这是来自 CDI 规范。将 Managed Beans 视为具有默认功能的(超)类,将 CDI bean 视为 Managed Bean 超类的专用(子类)版本。是的,您不需要任何注释来定义托管 Bean。一个有效的托管 bean 享有容器提供给它的以下服务——生命周期管理、资源注入和拦截器。 CDI 建立在托管 bean 规范之上并提供附加服务——主要是上下文依赖注入。要将简单的托管 bean 转换为 CDI bean,您需要定义 CDI 特定的注释 【参考方案1】:

听起来您已经习惯了 CDI 1.0,但现在对 CDI 1.1 中引入的隐式 bean 归档感到困惑。

beans.xml 现在是可选的,隐式 bean 存档是默认设置,这意味着只有当一个类具有 bean 定义注释(如 @Dependent@RequestScoped 等)时,它才是候选 bean。

【讨论】:

但是规范:一个托管 bean 是由一个 Java 类实现的,称为它的 bean 类 [...] 不需要特殊的声明,例如注解,来定义一个托管 bean. 您可以将 隐式 bean 档案 转换为 显式 bean 档案,例如。通过在beans.xml 中将bean-discovery-mode 设置为all:docs.jboss.org/cdi/spec/1.1/cdi-spec.html#bean_archive CDI 1.2 规范中的相关部分在这里:docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_archive @gurghet 默认情况下,CDI 1.1+ 甚至不需要您创建空 beans.xml(因为它是 v1.0 所要求的)默认情况下只有标记为范围注释由 CDI 容器管理。

以上是关于除非显式注释,否则不会发现 CDI bean的主要内容,如果未能解决你的问题,请参考以下文章

除非已注释掉print语句,否则收集的任务不会同时运行。为什么?

将 JSF 托管 bean 迁移到 CDI 托管 bean

命名 CDI bean 的默认范围是啥?

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

JSF、CDI 和 EJB 容器:应该使用它们的哪种组合?

我的 Swift MapKit 注释没有显示