上下文和依赖性注入 1.2 行为更改
上下文和依赖性注入 (CDI) 1.2 实现包含一些行为更改,它们可能导致从 CDI 1.0 迁移的应用程序在 CDI 1.2 上以不同方式运行或失败。
CDI 1.0 基于 CDI 的 Apache OpenWebBeans 实现,而 CDI 1.2 基于 Weld 实现。引入的行为更改会体现这两个实现之间的差别。
对话标识 CID
在 CDI 1.0 实现中,CID 是全局唯一的。在 CDI 1.2 中,对于每个 HTTP 会话,它是唯一的。此行为符合 CDI 规范并由 Weld 实现。要获取全局唯一 CID,必须在对话开始时通过调用 Conversation.begin 来指定 CID。
在 beans.xml 文件中引用模式
beans.xml 文件引用了以下模式示例:
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
如果您使用无效模式,那么服务器将给出异常错误。设置 org.jboss.weld.xml.disableValidating=true 以关闭 beans.xml 文件的验证并防止发生错误。如果 beans.xml
文件指定修饰符或拦截器,那么必须使用有效模式,否则修饰符和拦截器不会正确实例化。隐式 bean 归档
CDI 1.2 实现定义两种不同类型的 bean 归档:显式和隐式。
显式 bean 归档包含具有下列任一特征的 beans.xml 文件:
- 版本号为 1.1(或更高版本),并且 bean-discovery-mode 为 all
- 没有版本号
- 空文件
隐式 bean 归档是任何其他归档,它包含一个或多个 bean 类(这些类的 bean 定义注释是在规范的 2.5.1 节“bean 定义注释”中定义的)或者一个或多个会话 bean。请参阅以下规范:用于 Java™ EE 平台的上下文和依赖性注入。
将模式更新为 CDI 1.2 实现时,为使 bean 归档保持为显式,bean 发现方式必须设置为 all:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all" version="1.1"
</beans>
注: 隐式 bean 归档仅发现具有 bean 定义注释的 bean。
这种新类型的 bean 归档可以产生一个归档,所产生的归档不会成为 CDI bean 归档,但在 CDI 1.2 实现中却会变为隐式 bean 归档。要停止此行为,您可以添加一个将 bean 发现方式设置为 none 的 beans.xml 文件,以阻止该归档变为 bean 归档。另一种解决方案是将系统属性 com.ibm.ws.cdi.enableImplicitBeanArchives 设置为 false。将此属性设置为 false 会阻止不含 beans.xml 文件的归档变为隐式 bean 归档并减少启动时间。 要了解如何设置系统属性,请参阅“Java 虚拟机设置”。
生命周期拦截器
如果在生命周期拦截器上声明了以下拦截器绑定,那么 ElementType.TYPE 将是唯一允许的目标:
@InterceptorBinding
@Retention( RetentionPolicy.RUNTIME )
@Target( {ElementType.TYPE, ElementType.METHOD} )
public @interface SFCDIInterceptorBinding {}