IoC 容器
本章涵盖了 Spring 的控制反转 (IoC) 容器。
章节摘要
Spring IoC 容器和 Bean 的介绍
本章涵盖了 Spring Framework 对控制反转 (IoC) 原则的实现。依赖注入 (DI) 是 IoC 的一种专门形式,在这种形式中,对象仅通过构造函数参数、工厂方法的参数或在对象实例构造后或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们所依赖的其他对象)。然后,IoC 容器在创建 bean 时注入这些依赖关系。这个过程从根本上是 bean 本身通过直接构造类或使用服务定位器模式等机制来控制其依赖关系的实例化或位置的逆过程(因此得名,控制反转)。
容器概述
org.springframework.context.ApplicationContext 接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据获取有关要实例化、配置和组装的组件的指令。配置元数据可以表示为注解的组件类、带有工厂方法的配置类,或外部 XML 文件或 Groovy 脚本。无论哪种格式,您都可以组合您的应用程序以及这些组件之间丰富的相互依赖关系。
Bean 概述
一个 Spring IoC 容器管理一个或多个 bean。这些 bean 是根据您提供给容器的配置元数据创建的(例如,以 XML 定义的形式)。
依赖项
6 个项目
Bean 范围
当你创建一个 bean 定义时,你实际上是在为创建该 bean 定义所定义类的实际实例制定一个配方。将 bean 定义视为配方这一概念非常重要,因为这意味着,和类一样,你可以从一个配方中创建多个对象实例。
自定义 Bean 的性质
Spring 框架提供了一些接口,您可以使用这些接口来自定义 bean 的性质。本节将它们分组如下:
Bean 定义继承
一个 bean 定义可以包含大量的配置信息,包括构造函数参数、属性值以及容器特定的信息,例如初始化方法、静态工厂方法名称等。子 bean 定义从父定义继承配置信息。子定义可以根据需要覆盖某些值或添加其他值。使用父子 bean 定义可以节省很多输入。实际上,这是一种模板化的形式。
容器扩展点
通常,应用程序开发人员不需要对 ApplicationContext 实现类进行子类化。相反,Spring IoC 容器可以通过插入特殊集成接口的实现来扩展。接下来的几个部分将描述这些集成接口。
基于注解的容器配置
8 个项目
类路径扫描和管理组件
本章中的大多数示例使用 XML 来指定生成每个 BeanDefinition 的配置元数据,该 BeanDefinition 存在于 Spring 容器中。前一节(基于注解的容器配置)演示了如何通过源级注解提供大量配置元数据。然而,即使在那些示例中,“基础” bean 定义仍然在 XML 文件中显式定义,而注解仅用于驱动依赖注入。本节描述了一种通过扫描类路径隐式检测候选组件的选项。候选组件是与过滤标准匹配的类,并且在容器中注册了相应的 bean 定义。这消除了使用 XML 进行 bean 注册的必要性。相反,您可以使用注解(例如,@Component)、AspectJ 类型表达式或您自己的自定义过滤标准来选择哪些类在容器中注册了 bean 定义。
使用 JSR 330 标准注解
Spring 提供对 JSR-330 标准注解(依赖注入)的支持。这些注解的扫描方式与 Spring 注解相同。要使用它们,您需要在类路径中包含相关的 jar 文件。
基于 Java 的容器配置
5 个项目
环境抽象
Environment 接口是集成在容器中的一种抽象,建模了应用程序环境的两个关键方面:配置文件和属性。
注册一个 LoadTimeWeaver
LoadTimeWeaver 是 Spring 用于在类加载到 Java 虚拟机 (JVM) 时动态转换类的工具。
ApplicationContext 的附加功能
如章节介绍中所讨论的,org.springframework.beans.factory 包提供了管理和操作 beans 的基本功能,包括以编程方式进行操作。org.springframework.context 包添加了 ApplicationContext 接口,该接口扩展了 BeanFactory 接口,并扩展了其他接口,以提供更面向应用程序框架风格的附加功能。许多人以完全声明的方式使用 ApplicationContext,甚至不以编程方式创建它,而是依赖于支持类,如 ContextLoader,在 Jakarta EE Web 应用程序的正常启动过程中自动实例化 ApplicationContext。
BeanFactory API
BeanFactory API 提供了 Spring IoC 功能的基础。它的具体契约主要用于与 Spring 的其他部分和相关第三方框架的集成,而其 DefaultListableBeanFactory 实现是更高级别的 GenericApplicationContext 容器中的一个关键委托。