【问题标题】:what is the purpose of including empty beans.xml in CDI implemenations projects?在 CDI 实现项目中包含空 beans.xml 的目的是什么?
【发布时间】:2013-08-10 11:19:18
【问题描述】:

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

【问题讨论】:

  • 你不能接受多个答案其实太糟糕了,因为 rdcrng 和 Flo 都是正确的。
  • @LightGuard... 我即将接受rdcrng 的回答。同时你发表了这条评论

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


【解决方案1】:

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

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

【讨论】:

  • it is therefore beneficial to explicitly indicate which bean archives should be scanned,我现在很困惑。当我们包含一个空的beans.xml 时,容器如何知道它扫描了哪些档案以创建实例以达到注入目的?
  • beans.xml 的存在表明档案应该被扫描
  • @AkselWillgert 谢谢 :) @SRy 就像 Aksel Willgert 所说,容器首先专门寻找 beans.xml 的存在,并根据它决定是否在该存档中进一步扫描。
  • @rdcrng.... 是的,在您回答和Askel's 评论后,这篇文章对我来说很有意义。 seamframework.org/Documentation/WhatIsBeansxmlAndWhyDoINeedIt
【解决方案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" 将在存档中扫描带注释的类中的 bean(例如 @Dependent )。所有其他类都将被忽略,因此不能作为 bean 注入。

3

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

4

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

【讨论】:

    【解决方案3】:

    在某些有限的情况下使用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2014-05-17
      • 2021-06-02
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多