上下文和依赖性注入 1.2 行为更改
上下文和依赖性注入 (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 实现。引入行为更改是因为这两个实现存在差别。
对话标识 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 发现方式设置为 none 的 beans.xml 文件,以阻止归档变为 bean 归档。另一解决方案是将以下属性添加至您的 Liberty
服务器的 server.xml 文件:
<cdi12 enableImplicitBeanArchives="false"/>
将此属性设置为 false
可阻止不带 beans.xml 文件的归档变为隐式 bean 归档。将此属性设置为 false 将在启动时提高性能。