Spring IoC 容器与 Bean 简介
本章介绍了 Spring Framework 对控制反转 (Inversion of Control, IoC) 原理的实现。
依赖注入 (Dependency Injection, DI) 是 IoC 的一种特殊形式。在这种形式中,对象仅通过构造函数参数、工厂方法参数,或在对象实例构造完成后(或从工厂方法返回后)设置的属性来定义它们的依赖关系(即它们所协同工作的其他对象)。然后,IoC 容器在创建这些 Bean 时注入这些依赖项。这个过程从根本上来说是“反向”的(因此得名“控制反转”),因为 Bean 本身不再通过直接构造类或使用“服务定位器 (Service Locator)”模式等机制来控制其依赖项的实例化或定位。
org.springframework.beans 和 org.springframework.context 包是 Spring Framework IoC 容器的基础。
BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext是BeanFactory的子接口。它增加了以下功能:- 更轻松地与 Spring 的 AOP 特性集成。
- 消息资源处理(用于国际化)。
- 事件发布机制。
- 特定于应用层的上下文,例如用于 Web 应用程序的
WebApplicationContext。
简而言之,BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 增加了更多企业级特定的功能。ApplicationContext 是 BeanFactory 的完整超集,在本章描述 Spring IoC 容器时将排他性地使用它。有关使用 BeanFactory 而非 ApplicationContext 的更多信息,请参阅 BeanFactory API 部分。
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。Bean 是由 Spring IoC 容器实例化、组装和管理的对象。除此之外,Bean 只是应用程序中众多对象之一。Bean 及其之间的依赖关系反映在容器使用的配置元数据中。
补充教学 —— 深度理解 IoC 与 Bean
1. IoC vs DI:到底是什么关系?
- IoC (控制反转) 是一个大概念、一种设计思想。它指的是“控制权”的转移(从代码主动 new 变成框架注入)。
- DI (依赖注入) 是 IoC 的具体实现方式。如果说 IoC 是“我要喝水”,那么 DI 就是“管家把水递到你手里”。
2. 为什么 Spring 建议使用 ApplicationContext? 虽然 BeanFactory 内存占用更低(适合移動端或极度资源受限的场景),但 ApplicationContext 提供的“全家桶”服务是现代后端开发不可或缺的。例如:
- 监听器机制:你可以轻松监听容器启动、停止等事件。
- AOP 自动代理:很多声明式功能(如
@Transactional)依赖于此。 - 资源加载:可以方便地通过
classpath:foo.xml这种形式读取资源。
3. “普通对象” vs “Bean”
- 你在代码里手动
new User()得到的是一个普通的 Java 对象,它不受 Spring 管辖。 - 你在类上加了
@Component或在@Configuration里写的@Bean方法,Spring 扫描到后会将其纳入“管家”的管辖范围。这时,它就是一个 Bean。 - 区别:Bean 拥有“户口”(在容器中注册),可以享受依赖注入、生命周期回调(如
@PostConstruct)等特殊待遇。
4. 关键点:配置元数据 容器并不是凭空知道该怎么创建 Bean 的。它需要“说明书”,也就是配置元数据。这些说明书可以是:
- XML 配置文件(传统的)。
- Java 注解(现代的,如
@Service,@Autowired)。 - Java 代码(基于编译器的,如
@Bean方法)。