6

weld在我的 JSF-EJB-JPA Web 应用程序中使用 CDI 的 RI 作为依赖注入组件。我在我的项目中看到我们的 WAR 中有空 的beans.xml META-INF/beans.xml。我不明白为什么在该文件中没有定义任何内容时我们需要保持空白?ejb.jarWEB-INF/beans.xmlbeans.xml

4

3 回答 3

8

CDI 需要在启动时扫描 bean 存档的所有类并触发一堆事件,因为几乎所有类都自动成为托管 bean(在此处阅读更多内容),即使它没有任何注释。

这会产生相当多的开销,特别是对于不包含任何 bean 的 jar 文件,因此通过包含beans.xml.

于 2013-08-08T16:45:27.310 回答
2

1

一个完全空的文件与包含以下内容的存档beans.xml相同:beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<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">
</beans>

由于bean-discovery-mode="all"将扫描存档以查找 bean。无需注释它们。

2

不存在beans.xml的它与beans.xml在存档中具有以下内容相同:

<?xml version="1.0" encoding="UTF-8"?>

<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="annotated">

</beans>

由于bean-discovery-mode="annotated"将在存档中扫描带注释的类(例如@Dependent)中的 bean。所有其他类将被忽略,因此不能作为 bean 注入。

3

第三种选择是声明bean-discovery-mode="none"在这种情况下,服务器从不扫描档案中的 bean。

4

现在,对于您想将一个类作为 bean 加载但您无法访问存档(例如外部库)并且该类没有注释的情况,解决方案是使用Producer 方法(带或不带限定符)。

于 2019-11-13T14:06:27.100 回答
0

它用于某些有限的情况

http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

某些 CDI 功能(如装饰器)将在此文件中声明

于 2013-08-08T16:35:50.170 回答