7.4. 受管 Bean

Jakarta EE 在 Jakarta 托管 Bean 规范中建立了通用定义。对于 Java 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 标注。
  • 它没有使用 EJB 组件定义注释,也不声明为 ejb-jar.xml 文件中的企业 Java Bean bean 类。
  • 它不实施接口 javax.enterprise.inject.spi.Extension
  • 它具有不含参数的构造器,或者带有 @Inject 标注的构造器。
  • 它不标有 @Vetoed,也不在标有 @Vetoed 的包中标注。

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

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

@Vetoed

CDI 1.1 中引入了 @Vetoed 注释。您可以通过添加此注解来防止 bean 注入:

@Vetoed
public class SimpleGreeting implements Greeting {
    ...
}

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

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

@Vetoed
package org.sample.beans;

import javax.enterprise.inject.Vetoed;

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

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