我正在使用weld
,一个CDI的RI作为我的JSF-EJB-JPA Web应用程序中的依赖注入组件。我在我的项目中看到,META-INF/beans.xml
中的ejb.jar
和我的WAR中的WEB-INF/beans.xml
都有空的beans.xml。我不明白为什么我们需要在该文件中没有定义时保持空beans.xml
?
答案 0 :(得分:7)
CDI需要在启动时扫描bean存档的所有类并触发一堆事件,因为几乎任何类都自动成为托管bean(阅读更多here),即使它没有任何注释。
这会产生相当多的开销,特别是对于不具有任何bean的jar文件,因此有必要通过包含beans.xml
来明确指示应扫描哪些bean存档。
答案 1 :(得分:0)
答案 2 :(得分:0)
完全为空的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。无需注释它们。
不存在的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注入。
第三个选择是声明 bean-discovery-mode =“ none” ,在这种情况下,服务器从不扫描归档文件中的bean。
现在对于要将类作为Bean加载但无法访问归档文件(例如外部库)且未注释该类的情况,解决方案是使用Producer methods(带有或没有预选赛)。