在CDI实现项目中包含空beans.xml的目的是什么?

时间:2013-08-08 16:26:30

标签: java jsf-2 cdi ejb-3.1 jboss-weld

我正在使用weld,一个CDI的RI作为我的JSF-EJB-JPA Web应用程序中的依赖注入组件。我在我的项目中看到,META-INF/beans.xml中的ejb.jar和我的WAR中的WEB-INF/beans.xml都有空的beans.xml。我不明白为什么我们需要在该文件中没有定义时保持空beans.xml

3 个答案:

答案 0 :(得分:7)

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

这会产生相当多的开销,特别是对于不具有任何bean的jar文件,因此有必要通过包含beans.xml来明确指示应扫描哪些bean存档。

答案 1 :(得分:0)

它在某些有限的情况下使用

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

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

答案 2 :(得分:0)

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 methods(带有或没有预选赛)。