发行版之间的上下文和依赖性注入行为更改

上下文和依赖性注入 (CDI) 1.2 实现包含一些行为更改,这些更改可能会导致从 CDI 1.0 迁移的应用程序在 CDI 1.2 上以不同方式运行或失败。

对于每个服务器实例,您可在考虑到行为更改的情况下,在 CDI 1.0 与 CDI 1.2 功能部件实现之间进行选择。如果只有 CDI 1.2 功能部件包含所需行为,那么必须使用 CDI 1.2 功能部件。如果 CDI 1.2 功能部件中的行为更改可能会对现有应用程序产生负面影响,请使用 CDI 1.0 功能部件,以保留该应用程序的现有行为。不能在同一服务器中同时使用 CDI 1.0 和 CDI 1.2 功能部件,因为这些功能部件彼此之间不兼容。如果同时配置这两个功能部件,那么服务器会产生配置错误。

CDI 1.0 功能部件是以 CDI 的 Apache OpenWebBeans 实现为基础。CDI 1.2 功能部件是以 CDI 的 Weld 实现为基础。引入行为更改是因为这两种实现之间存在差别。

从 CDI 1.0 迁移到 CDI 1.2

对话标识 CID

在 CDI 1.0 实现中,CID 是全局唯一的。在 CDI 1.2 中,它在每个 HTTP 会话中是唯一的。此行为符合 CDI 规范,并且是 Weld 所选择的约定。要获取全局唯一 CID,必须在对话开始时通过调用 Conversation.begin 来指定 CID。

beans.xml 文件中引用模式
在 CDI 1.2 实现中,以下是 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 JVM 属性来关闭 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">
注: 隐式 Bean 归档仅会发现具有 Bean 定义注释的 Bean。
这类 Bean 归档可产生一个归档,该归档不是要用作 CDI Bean 归档,而是在 CDI 1.2 实现中变为隐式 Bean 归档。要停止此行为,您可添加将 Bean 发现方式设置为 nonebeans.xml 文件,以阻止该归档变为 Bean 归档。另一种解决办法是,在 Liberty 服务器的 server.xml 文件中添加 enableImplicitBeanArchives 属性:
<cdi12 enableImplicitBeanArchives="false"/>
将此属性设置为 false 可阻止不含 beans.xml 文件的归档变为隐式 Bean 归档。

将此属性设置为 false 可提高启动时的性能。


用于指示主题类型的图标 概念主题

文件名:cwlp_cdi_behavior.html