7.2. 使用 Jakarta 上下文和依赖注入来开发应用程序


Jakarta Contexts 和 Dependency Injection 在开发应用程序、重用代码、在部署或运行时修改代码以及单元测试方面为您提供巨大的灵活性。

我们ld 为应用程序开发提供了一个特殊模式。启用后,可以使用某些内置工具,协助 Jakarta Contexts 和 Dependency Injection 应用程序的开发。

注意

开发模式不应在生产环境中使用,因为它可能会对应用的性能造成负面影响。在部署到生产环境之前,务必禁用开发模式。

为 Web 应用程序启用开发模式:

对于 web 应用程序,将 servlet 初始化参数 org.jboss.weld.development 设置为 true

<web-app>
    <context-param>
        <param-name>org.jboss.weld.development</param-name>
        <param-value>true</param-value>
    </context-param>
</web-app>
Copy to Clipboard Toggle word wrap

使用管理 CLI 为 JBoss EAP 启用开发模式:

通过将 development-mode 属性设置为 true,可以为部署的所有应用程序全局启用 Weld 开发模式:

/subsystem=weld:write-attribute(name=development-mode,value=true)
Copy to Clipboard Toggle word wrap

7.2.1. 默认 Bean 发现模式

Bean 存档的默认 bean 发现模式被 标注。此类 Bean 存档 被认为是隐式 Bean 存档

如果 注解 了 bean 发现模式,则:

  • 不会发现没有 bean 定义注解 且不是 Bean 类会话 Bean 类的 Bean 类。
  • 不在会话 Bean 上以及 bean 类没有 Bean 定义注释的制作者方法不会发现。
  • 不在会话 Bean 上以及 bean 类没有 Bean 定义注解的制作者字段不会被发现。
  • 不在会话 Bean 上且 bean 类没有 Bean 定义注解的推理器方法不会被发现。
  • 不在会话 Bean 上以及 bean 类没有 Bean 定义注解的观察方法不会发现。
重要

只有将发现模式设置为 all 时,Contexts 和 Dependency Injection 部分中的所有示例才有效。

Bean 定义注解

Bean 类可以具有一个 定义注解的 Bean,以便能够将其放置在应用程序中的任何位置,如 bean 存档中所定义。Bean 类中带有 Bean 定义注解,这被认为是隐式 Bean。

Bean 定义注解集合包含:

  • @ApplicationScoped@SessionScoped@ConversationScoped@RequestScoped 注释.
  • 所有其他普通范围类型.
  • @interceptor@Decorator 注释.
  • 所有 stereotype 注释,即标有 @Stereotype 的 注释。
  • @Dependent 范围注释.

如果在 Bean 类上声明其中一个注释,则 bean 类被认为具有 Bean 定义注释。

示例:Bean 定义注解

@Dependent
public class BookShop
        extends Business
        implements Shop<Book> {
    ...
}
Copy to Clipboard Toggle word wrap

注意

为确保与其他 JSR-330 实施以及 Jakarta 上下文和依赖注入规范兼容,除 @Dependent 外,所有伪作用注释都不是定义注释。但是,stereotype 注释(包括伪范围注释)是 Bean 定义注解。

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>
Copy to Clipboard Toggle word wrap
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

7.2.3. 使用注入来扩展实施

您可以使用注入来添加或更改现有代码的功能。

以下示例为现有类添加了转换功能,并假定您已有一个 Welcome 类,它具有方法 buildPhrasebuildPhrase 方法将城市名称用作参数,并输出一个短语,如"Welcome to Boston!"。

这个示例将假设的转换 对象注入到 Welcome 类中。Translator 对象可以是 Jakarta Enterprise Beans 无状态 Bean 或其他类型的 bean,它可以将句子从一个语言转换为另一种语言。在这个示例中,转换 器用于 转译整个问候语,而不修改原始 Welcome 类。Translator 在调用 buildPhrase 方法之前注入。

示例:将一个翻译器 Bean 注入 欢迎

public class TranslatingWelcome extends Welcome {

    @Inject Translator translator;

    public String buildPhrase(String city) {
        return translator.translate("Welcome to " + city + "!");
    }
    ...
}
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat