除非显式注释,否则不会发现 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语句,否则收集的任务不会同时运行。为什么?