CDI 识别隐式 bean 归档

Contexts and Dependency Injection (CDI) 1.1 规范引入了隐式 bean 发现方式,从而导致 WebSphere Application Server 中 Java Platform, Enterprise Edition (Java EE) 6 CDI 1.0 实现中的行为和性能更改。隐式 bean 是满足以下条件的任何归档:包含一个或多个 bean 类,且这些 bean 类带有一个 bean 定义注释或者一个或多个会话 bean。

从 Java EE 6 CDI 1.0 移至 Java EE 7 CDI 1.1 或更高版本时,隐式 bean 发现将导致所有 WAR 和 JAR 文件由运行时扫描,即使这些文件没有 beans.xml 文件也是如此。该扫描与 Java EE 6 CDI 1.0 相比存在行为更改,在 1.0 中,缺少 beans.xml 文件会阻止扫描应用程序中的归档。

该规则标记没有 beans.xml 文件的所有 WAR 和 JAR 文件中的以下 bean 定义注释和 Enterprise JavaBeans (EJB) 会话 bean。

二进制应用程序扫描器会标记注释为 @NormalScope. 这些注释即使出现在 出现在 beans.xml 显式或隐式使用这些注释的文件的上下文之外。

要在运行时在 WAR 或 JAR 级别禁用该 CDI 行为更改,请添加 beans.xml 文件并将 bean 发现方式设置为 none,如以下示例中所示。


<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="none" version="1.1">
</beans>

在 Liberty 上,还可通过将以下属性添加到 server.xml 文件来禁用该行为。


<cdi12 enableImplicitBeanArchives="false"/>

有关 Java EE 7 CDI 1.2 实现的更多信息,请参阅 Contexts and Dependency Injection 1.2 behavior changes