Dependency injection @javax.annotation.ManagedBean是定义注释的CDIBean吗? 问题

Dependency injection @javax.annotation.ManagedBean是定义注释的CDIBean吗? 问题,dependency-injection,cdi,managed-bean,glassfish-4,java-ee-7,Dependency Injection,Cdi,Managed Bean,Glassfish 4,Java Ee 7,考虑到我们部署的存档是一个“隐式bean存档”(见下文),在WildFly 8.1.0中使用将注入到另一个托管bean中,但在GlassFish 4.0.1-b08和GlassFish 4.1-b13中都不起作用。GlassFish崩溃,并显示以下消息: WELD-001408:类型的未满足依赖项 我是否误解了以下概述的规范,或者GlassFish是否有缺陷 CDI 1.1第1部分 CDI 1.1()第12.1节“Bean归档”中说: 显式bean归档是包含beans.xml文件的归档 [..]

考虑到我们部署的存档是一个“隐式bean存档”(见下文),在WildFly 8.1.0中使用将注入到另一个托管bean中,但在GlassFish 4.0.1-b08和GlassFish 4.1-b13中都不起作用。GlassFish崩溃,并显示以下消息:

WELD-001408:类型的未满足依赖项

我是否误解了以下概述的规范,或者GlassFish是否有缺陷

CDI 1.1第1部分 CDI 1.1()第12.1节“Bean归档”中说:

显式bean归档是包含beans.xml文件的归档 [..]. 隐式bean存档是包含一个bean的任何其他存档 一个或多个具有bean定义注释[…]的bean类

如果我的归档文件没有
beans.xml
描述符文件,我仍然可以使用具有“bean定义注释”的bean。问题是,什么是定义bean的注释

CDI规范第2.5节“Bean定义注释”指出:

任何范围类型都是定义bean的注释

这是非常清楚的,根据CDI规范的这一部分,这就是它的全部内容。例如,如果我部署的归档文件中没有
beans.xml
描述符文件,那么我可以@injectbean,只要它们具有显式声明的作用域。它对野生蝇和玻璃鱼都有效。然而

豆角 javaee技术栈中的所有规范都必须遵守的子集规范managedbeans(),有一个“基本模型”,其中定义了一个managedbean。托管bean规范没有说
@ManagedBean
使bean成为注入点(即字段或参数)的合理注入目标。规范确实说bean“可以在JavaEE应用程序中的任何地方使用”(MB.1.2节“为什么是托管bean?”),这在我听来似乎也应该是可注入的

JavaEE7伞形规范 Java EE 7规范()在EE.5.24节“对依赖项注入的支持”中有这样的表述:

容器必须支持带有注释的注入点 javax.inject.inject注释仅限于CDI指定的范围。每 托管服务器上支持CDI规范、依赖项注入 豆子

当前,有三种方法可以使类成为托管bean:

  • 作为EJB会话bean组件
  • 正在使用ManagedBean注释进行注释
  • 满足CDI规范中描述的条件
  • 至少满足其中一个条件的类将符合条件 用于CDI中描述的完全依赖项注入支持 规格

    好了:@ManagedBean拥有“完全依赖注入支持”。不是一半或只是一点点的支持。然而,我不太确定“依赖注入支持”到底是什么。但我认为下面的一段描述得足够好:

    表EE.5-1中列出的满足第三种要求的部件类别 上述条件,但第一个条件和第二个条件都不能 如果使用CDI注释,也可以用作CDI管理的bean bean定义注释或包含在bean存档中,CDI 已启用。但是,如果它们用作CDI管理的bean(例如。, 注入到其他托管类中),管理的实例 CDI可能不是由JavaEE管理的实例 容器

    基本上,本段所说的第二个条件是可以注入到其他托管类中的CDI托管bean(因为异常bean“也可以”)

    伞形规范和托管bean规范都在一定程度上明确了CDI规范是最后的决定因素

    CDI 1.1第2部分 CDI规范中只提到了两次
    @ManagedBean
    注释,这两次注释都出现在第11章中,该章讲述了CDI扩展可以观察到的生命周期CDI事件。第11.5.7节是一个点击,定义了一个
    ProcessInjectionPoint
    事件。托管bean可以使用依赖项注入——这并不奇怪。但是,第11.5.8节定义了
    ProcessInjectionTarget
    事件。以下是规范对ProcessInjectionTarget事件的说明:

    容器必须为每个JavaEE组件类触发一个事件 支持可由容器在 运行时,包括使用@ManagedBean、EJB声明的每个托管bean 会话或消息驱动bean、bean、拦截器或装饰器

    这个短语毫无疑问地表示,
    @ManagedBean
    可以用作注入点的目标,而不添加范围类型的概念(始终是默认的)

    如前所述,从隐式bean归档中注入@ManagedBean在WildFly中起作用,据我所知,这是刚才引用的所有JavaEE规范所要求的。所以我认为是玻璃鱼有虫子。但是CDI规范在第2.5节“Bean定义注释”中从未提到过@ManagedBean,而且一如既往,在阅读重叠的JavaEE规范时,我会神经崩溃,所以我认为在我去向GlassFish团队提交一个“关键”bug之前,我应该先问一下

    编辑2014-08-22
    提交了一个GlassFish bug:。

    这不是一个完整的答案,因为当我们试图将所有规范放在一起并解释清楚时,不可避免地会出现混淆。我只想说,这澄清了bean定义注释的确切含义(请参阅“2.5.1.bean定义注释”一节)。CDI 1.2列出一份清单:

    定义bean的注释集包含:

    • @ApplicationScoped、@SessionScoped、@ConversationScoped和@RequestScoped注释
    • 所有其他正常范围类型
    • @拦截器和@Decorator注释