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 {
    ...
}
@Vetoed
public class SimpleGreeting implements Greeting {
    ...
}
					在这个代码中,SimpleGreeting Bean 不视为注入。
				
软件包中的所有 bean 可以被禁止注入:
@Vetoed package org.sample.beans; import javax.enterprise.inject.Vetoed;
@Vetoed
package org.sample.beans;
import javax.enterprise.inject.Vetoed;
					此代码在 org.sample  代码将阻止此软件包中的所有 bean 注入。
				.beans 软件包中的 package-info. java
					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 文件。
				
将对象注入其他对象
- 要获取类的实例,请在 bean 中为字段标上 - @Inject:- public class TranslateController { @Inject TextTranslator textTranslator; ...- public class TranslateController { @Inject TextTranslator textTranslator; ...- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 直接使用注入的对象方法。假设 - TextTranslator有一个方法- 转换:- // in TranslateController class public void translate() { translation = textTranslator.translate(inputText); }- // in TranslateController class public void translate() { translation = textTranslator.translate(inputText); }- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 在 Bean 的构造器中使用注入。您可以将对象注入到 Bean 的构造器中,作为使用工厂或服务定位器创建对象的替代方法: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 使用 - Instance(<T>)接口以编程方式获取实例。当使用 bean 类型进行参数化时,- Instance接口可以返回- TextTranslator的实例。- @Inject Instance<TextTranslator> textTranslatorInstance; ... public void translate() { textTranslatorInstance.get().translate(inputText); }- @Inject Instance<TextTranslator> textTranslatorInstance; ... public void translate() { textTranslatorInstance.get().translate(inputText); }- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
将对象注入 Bean 时,所有对象的方法和属性都可用于您的 Bean。如果您注入到 bean 的构造器中,则调用 bean 的构造器时会创建注入对象的实例,除非注入引用已存在的实例。例如,如果在会话生命周期内注入会话范围 Bean,则不会创建新的实例。