7.2.2. 从扫描过程中排除 Bean

排除过滤器由 bean 归档的 beans.xml 文件中的 <exclude> 元素定义为 <scan> 元素的 子项。默认情况下,排除过滤器处于活动状态。如果 exclude 过滤器包含以下内容,则 exclude 过滤器将变为不活跃:

  • 名为 <if-class-available> 的子元素及 name 属性,并且 bean 存档的类加载器无法为该名称加载类,或者
  • 名为 <if-class-not-available> 的子元素及 name 属性,bean 存档的类加载器可以为该名称加载类,或者
  • 名为 <if-system-property> 且带有 name 属性的子元素,没有为该名称定义系统属性,或者
  • 名为 <if-system-property> 的子元素带有 name 属性和 value 属性,没有为该名称定义具有该值的系统属性。

如果过滤器活跃,则该类型不在发现中,且:

  • 被发现的类型的完全限定名称与 exclude 过滤器的 name 属性的值匹配,或者
  • 被发现类型的软件包名称与 exclude 过滤器的 name 属性的值匹配,或者后缀为 ".*"。
  • 被发现类型的软件包名称以 exclude 过滤器的 name 属性值开头

例 7.1. 示例: beans.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee">

    <scan>
        <exclude name="com.acme.rest.*" /> 1

        <exclude name="com.acme.faces.**"> 2
            <if-class-not-available name="javax.faces.context.FacesContext"/>
        </exclude>

        <exclude name="com.acme.verbose.*"> 3
            <if-system-property name="verbosity" value="low"/>
        </exclude>

        <exclude name="com.acme.ejb.**"> 4
            <if-class-available name="javax.enterprise.inject.Model"/>
            <if-system-property name="exclude-ejbs"/>
        </exclude>
    </scan>

</beans>
1
第一个排除过滤器将排除 com.acme.rest 软件包中的所有类。
2
第二个排除过滤器将排除 com.acme.faces 软件包中的所有类,以及任何子软件包,但仅当 Jakarta Server Faces 不可用时。
3
如果系统属性 详细 程度较低,则第三个排除过滤器将排除 com.acme.verbose 软件包中的所有类。
4
如果系统属性 exclude- ejbs 设置了任何值,并且同时 javax.enterprise.inject.Model 类也可用于类加载器,则第四个排除过滤器将排除 com.acme. ej b 软件包中的所有类,以及任何子软件包。
注意

使用 @Vetoed 标注 Jakarta EE 组件是安全的,防止它们被视为 Bean。事件不会触发标有 @Vetoed 的 任何类型,也不会在标有 @Vetoed 的软件包中触发。如需更多信息,请参见 @Vetoed