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

SRy*_*SRy 4 java cdi jsf-2 ejb-3.1 jboss-weld

我正在使用weld,CDI的RI作为我的JSF-EJB-JPA Web应用程序中的依赖注入组件.我在我的项目看,我们有空的beans.xml在 META-INF/beans.xmlejb.jarWEB-INF/beans.xml在我的抗战.我不明白为什么我们需要beans.xml在那个文件中没有定义时保持空?

rdc*_*rng 8

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

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

  • 仅仅存在beans.xml就是指示应该扫描存档 (6认同)
  • “因此,明确指示应该扫描哪些 bean 档案是有益的”,我在这一点上感到困惑。当我们包含一个空的“beans.xml”时,容器如何知道它扫描了哪些档案以创建用于注入目的的实例? (2认同)

Mar*_* An 5

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>
Run Code Online (Sandbox Code Playgroud)

由于bean-discovery-mode="all",将扫描存档中的 beans。无需注释它们。

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>
Run Code Online (Sandbox Code Playgroud)

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

3

第三个选项是声明bean-discovery-mode="none"在这种情况下,服务器永远不会扫描存档中的 Bean。

4

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