7.4. 受管 Bean


Jakarta EE 在 Jakarta 托管 Bean 规范 中建立了通用定义。对于 Jakarta EE,受管 Bean 定义为容器管理的 Bean,具有最少的编程限制,否则被缩写为 POJO(Plain Old Java 对象)已知的。它们支持一组基本服务,如资源注入、生命周期回调和拦截器。配套规范(如 Jakarta Enterprise Beans 和 Jakarta Contexts 和 Dependency Injection)构建在这个基本模型之上。

除极少数外,几乎每个没有参数的构造器或带有注释 @Inject 的构造器都是 bean。这包括每个 JavaBean 和每个 Jakarta Enterprise Beans 会话 bean。

7.4.1. Bean 类

受管 Bean 是 Java 类。对于 Jakarta EE,受管 Bean 的基本生命周期和语义按照 Jakarta Managed Beans 1.0 规范 进行定义。您可以通过注解 beanagedBean 类来明确声明受管 Banaged Bean,但在上下文和依赖注入中,您不需要这样做。根据规范,上下文和依赖注入容器将满足以下条件的任何类视为受管 Bean:

  • 这不是一个非静态内类。
  • 它是具体类,或者带有 @Decorator 标注。
  • 它没有使用 Jakarta Enterprise Beans 组件定义注释,也不声明为 ejb-jar.xml 文件中的 Jakarta Enterprise Beans bean 类。
  • 它不实施接口 javax.enterprise.inject.spi.Extension
  • 它具有不含参数的构造器,或者带有 @Inject 标注的构造器。
  • 它不标有 @Vetoed,也不在标有 @Vetoed 的包中标注。

受管 Bean 的无限制 Bean 类型包含 Bean 类、每个超级类,以及它直接或间接实施的所有接口。

如果受管 Bean 具有公共字段,则必须具有默认范围 @Dependent

@Vetoed

您可以对类进行处理,从而不会安装本课程定义的 beans 或观察方法:

@Vetoed
public class SimpleGreeting implements Greeting {
    ...
}
Copy to Clipboard Toggle word wrap

在这个代码中,SimpleGreeting Bean 不视为注入。

软件包中的所有 bean 可以被禁止注入:

@Vetoed
package org.sample.beans;

import javax.enterprise.inject.Vetoed;
Copy to Clipboard Toggle word wrap

此代码在 org.sample .beans 软件包中的 package-info. java 代码将阻止此软件包中的所有 bean 注入。

Jakarta EE 组件(如无状态 Jakarta Enterprise Beans 或 Jakarta RESTful Web Services 资源端点)可以标记为 @Vetoed,以防止它们被视为 bean。将 @Vetoed 注释添加到所有持久实体可防止 BeanManager 将实体作为 Jakarta 上下文和依赖注入 Bean 管理。当实体使用 @Vetoed 标注时,不会进行注入。其背后的原因是防止 BeanManager 执行可能导致 Jakarta Persistence 供应商中断的操作。

7.4.2. 使用上下文和依赖注入将对象注入 Bean

如果在应用程序中检测到上下文和依赖注入组件,则上下文和依赖注入会自动激活。如果要自定义配置使其与默认值不同,您可以在部署存档中包含 META-INF/beans.xml 文件或 WEB-INF/beans.xml 文件。

将对象注入其他对象
  1. 要获取类的实例,请在 bean 中为字段标上 @Inject:

    public class TranslateController {
       @Inject TextTranslator textTranslator;
       ...
    Copy to Clipboard Toggle word wrap
  2. 直接使用注入的对象方法。假设 TextTranslator 有一个方法 转换

    // in TranslateController class
    
    public void translate() {
       translation = textTranslator.translate(inputText);
    }
    Copy to Clipboard Toggle word wrap
  3. 在 Bean 的构造器中使用注入。您可以将对象注入到 Bean 的构造器中,作为使用工厂或服务定位器创建对象的替代方法:

    public class TextTranslator {
    
       private SentenceParser sentenceParser;
       private Translator sentenceTranslator;
    
       @Inject
       TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) {
          this.sentenceParser = sentenceParser;
          this.sentenceTranslator = sentenceTranslator;
       }
    
       // Methods of the TextTranslator class
       ...
    }
    Copy to Clipboard Toggle word wrap
  4. 使用 Instance(<T>) 接口以编程方式获取实例。当使用 bean 类型进行参数化时,Instance 接口可以返回 TextTranslator 的实例。

    @Inject Instance<TextTranslator> textTranslatorInstance;
    ...
    public void translate() {
       textTranslatorInstance.get().translate(inputText);
    }
    Copy to Clipboard Toggle word wrap

将对象注入 Bean 时,所有对象的方法和属性都可用于您的 Bean。如果您注入到 bean 的构造器中,则调用 bean 的构造器时会创建注入对象的实例,除非注入引用已存在的实例。例如,如果在会话生命周期内注入会话范围 Bean,则不会创建新的实例。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat