Spring 的核心价值在于其设计理念而非单纯的技术实现。控制反转(IoC)与面向切面编程(AOP)是两大基石,其中 IoC 更是 Spring 的根基。本章聚焦于基于注解的 IoC 实践,这也是 Spring Boot 开发的主流方式。
核心概念
传统开发中,对象通常通过 new 关键字直接实例化。而在 Spring 体系中,对象的创建和依赖管理交由容器处理。我们通过描述(如注解或 XML)来定义 Bean,容器负责装配这些对象及其关系。例如,一个'班级'对象依赖于多个'老师'和'同学',这种依赖关系同样由容器维护。
在 Spring 中,所有需要管理的对象统称为 Bean,而管理它们的容器被称为 IoC 容器。它主要承担两个职责:
- 管理 Bean 的生命周期(定义、发布、获取、销毁);
- 管理 Bean 之间的依赖关系。
容器的两大接口
IoC 容器的底层核心是 BeanFactory 接口。虽然实现类众多,但理解其基本方法足以应对大部分场景。
public interface BeanFactory {
// 根据名称获取 Bean
Object getBean(String name) throws BeansException;
// 根据类型获取 Bean
<T> T getBean(Class<T> requiredType) throws BeansException;
// ... 其他方法
}
实际开发中,更常用的是 ApplicationContext,它是 BeanFactory 的子接口。相比基础接口,它扩展了国际化支持、事件发布、资源解析等高级功能。
从架构上看,ApplicationContext 继承了 BeanFactory 的所有能力,并增加了消息源、环境配置和应用事件发布等功能。在 Spring Boot 环境下,推荐使用 AnnotationConfigApplicationContext 进行全注解配置,这与生产环境的容器行为最为接近。
实战:构建第一个 IoC 容器
1. 定义 Bean
首先创建一个简单的角色类作为被管理的对象。
package com.example.demo.po;
public class Role {
private Long id;
private String roleName;
private String note;
public Long getId() { return id; }
public void setId { .id = id; }
String { roleName; }
{ .roleName = roleName; }
String { note; }
{ .note = note; }
}


