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