
![[8.5.5.6 或更高版本]](../ng_v8556.gif)
上下文和依赖性注入 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 实现。引入行为更改是因为这两个实现存在差别。
对 bean 使用 @Named 注释
使用 @Named 注释分配给类的缺省名称是未限定类名,第一个字母从大写更改为小写。例如,TestBean 缺省为 testBean。在 CDI 1.0 实现中,此行为适用于所有类名。Weld 实现遵循 JavaBeans 规范,对于开头有多个大写字母的类名,此规范有不同行为。在此实例中,给予该 bean 的名称未移除任何大写字母。例如,JSFTest 是使用 JSFTest 从 JavaServer Pages (JSP) 调用的。
对话标识 CID
在 CDI 1.0 实现中,CID 是全局唯一的。在 CDI 1.2 中,对于每个 HTTP 会话,它是唯一的。此行为符合 CDI 规范,并且是 Weld 选择的约定。要获取全局唯一 CID,必须在对话开始时通过调用 Conversation.begin 来指定 CID。
在 beans.xml 文件中引用模式
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"
如果使用了无效模式,那么会导致服务器上出现异常错误。可通过设置 org.jboss.weld.xml.disableValidating=true jvm
属性来关闭 beans.xml 文件的验证,这也会避免产生该错误。如果 beans.xml
文件指定修饰符或拦截器,那么必须使用有效模式,否则修饰符和拦截器不会正确实例化。隐式 bean 归档
CDI 1.2 实现定义两种不同类型的 bean 归档:显式和隐式。
- 版本号为 1.1(或更高版本),并且 bean-discovery-mode 为 all
- 没有版本号
- 为空文件
隐式 bean 归档是任何其他归档,它包含一个或多个 bean 类(这些类的 bean 定义注释是在规范的 2.5.1 节“bean 定义注释”中定义的)或者一个或多个会话 bean。请参阅以下规范:用于 Java™ EE 平台的上下文和依赖性注入。
<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">
<cdi12 enableImplicitBeanArchives="false"/>
将此属性设置为 false
可阻止不带 beans.xml 文件的归档变为隐式 bean 归档。