我weld
在我的 JSF-EJB-JPA Web 应用程序中使用 CDI 的 RI 作为依赖注入组件。我在我的项目中看到我们的 WAR 中有空 的beans.xml META-INF/beans.xml
。我不明白为什么在该文件中没有定义任何内容时我们需要保持空白?ejb.jar
WEB-INF/beans.xml
beans.xml
问问题
3347 次
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
于 2013-08-08T16:35:50.170 回答