Dependency injection @javax.annotation.ManagedBean是定义注释的CDIBean吗? 问题
考虑到我们部署的存档是一个“隐式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类 如果我的归档文件没有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文件的归档 [..]
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:
@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注释