Skip to content

Spring IoC 容器与 Bean 简介

本章介绍了 Spring Framework 对控制反转 (Inversion of Control, IoC) 原理的实现。

依赖注入 (Dependency Injection, DI) 是 IoC 的一种特殊形式。在这种形式中,对象仅通过构造函数参数、工厂方法参数,或在对象实例构造完成后(或从工厂方法返回后)设置的属性来定义它们的依赖关系(即它们所协同工作的其他对象)。然后,IoC 容器在创建这些 Bean 时注入这些依赖项。这个过程从根本上来说是“反向”的(因此得名“控制反转”),因为 Bean 本身不再通过直接构造类或使用“服务定位器 (Service Locator)”模式等机制来控制其依赖项的实例化或定位。

org.springframework.beansorg.springframework.context 包是 Spring Framework IoC 容器的基础。

  • BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象。
  • ApplicationContextBeanFactory 的子接口。它增加了以下功能:
    • 更轻松地与 Spring 的 AOP 特性集成。
    • 消息资源处理(用于国际化)。
    • 事件发布机制。
    • 特定于应用层的上下文,例如用于 Web 应用程序的 WebApplicationContext

简而言之,BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 增加了更多企业级特定的功能。ApplicationContextBeanFactory 的完整超集,在本章描述 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 方法)。

Based on Spring Framework.