Spring 知识体系概览
什么是 Spring?
Spring 是 Java 世界中最流行的企业级应用开发框架,由 Rod Johnson 于 2003 年创建。它的核心目标是简化 Java 企业级开发——在 Spring 出现之前,Java EE(J2EE)开发需要大量编写样板代码、处理复杂的配置,Spring 通过 IoC 和 AOP 两大核心技术极大地降低了开发复杂度。
如果把 Java 后端开发比作建筑,Spring 就是"钢筋骨架"——几乎所有 Java 后端项目都构建在 Spring 之上(直接使用 Spring Framework 或其扩展 Spring Boot/Spring Cloud)。
为什么 Spring 如此重要?
| 原因 | 说明 |
|---|---|
| 行业标准 | 超过 80% 的 Java 企业项目使用 Spring |
| 面试核心 | IoC、AOP、Bean 生命周期、事务管理是 Java 面试必问项 |
| 生态完善 | Spring Boot、Spring Cloud、Spring Security、Spring Data 覆盖方方面面 |
| 设计优雅 | 大量运用设计模式(工厂、代理、模板方法、观察者等),学 Spring 就是学设计 |
核心知识点
IoC——控制反转,Spring 的"灵魂"
IoC(Inversion of Control,控制反转) 是 Spring 最核心的理念。
在传统编程中,对象 A 需要对象 B 时,A 自己创建 B:
// 传统方式:A 自己创建 B(A 控制 B 的生命周期)
public class UserService {
private UserDao userDao = new UserDaoImpl(); // 硬编码依赖
}
在 Spring 中,对象的创建和管理交给 Spring 容器(IoC Container),由容器"注入"依赖:
// Spring 方式:容器注入 B(控制权"反转"到了容器)
@Service
public class UserService {
@Autowired
private UserDao userDao; // 由 Spring 容器自动注入
}
IoC 的实现方式就是 DI(Dependency Injection,依赖注入)——通过构造器注入、Setter 注入或字段注入将依赖对象交给被依赖者。
AOP——面向切面编程
AOP(Aspect-Oriented Programming) 将跨越多个业务模块的横切关注点(如日志、事务、权限、缓存)抽取出来,统一处理,避免在每个业务方法中重复编写:
Spring AOP 的底层是动态代理:
- 目标类实现了接口 → JDK 动态代理(基于
Proxy+InvocationHandler) - 目标类没有接口 → CGLIB 代理(基于字节码生成子类)
AOP 有 5 种通知类型:@Before(前置)、@After(后置)、@AfterReturning(返回后)、@AfterThrowing(异常后)、@Around(环绕)。
Bean 生命周期——Spring 管理对象的"一生"
Spring Bean 从创建到销毁经历完整的生命周期:
- 实例化:通过构造器创建 Bean 实例
- 属性填充:注入依赖(
@Autowired等) - Aware 回调:如
BeanNameAware、ApplicationContextAware - BeanPostProcessor 前置处理:
postProcessBeforeInitialization - 初始化:
@PostConstruct→InitializingBean.afterPropertiesSet()→init-method - BeanPostProcessor 后置处理:
postProcessAfterInitialization(AOP 代理在此创建) - 使用阶段
- 销毁:
@PreDestroy→DisposableBean.destroy()→destroy-method
事务管理——数据一致性的"守门人"
Spring 通过 @Transactional 注解提供声明式事务管理,底层基于 AOP 拦截。
7 种传播行为中最常用的是:
REQUIRED(默认):当前有事务就加入,没有就新建REQUIRES_NEW:总是新建事务,挂起当前事务NOT_SUPPORTED:以非事务方式执行,挂起当前事务
- 自调用:同一个类中方法 A 调用方法 B(
@Transactional在 B 上),代理对象没有被调用 - 非 public 方法:Spring 默认只对 public 方法生效
- 异常被 catch:事务只在抛出异常时回滚,catch 后不抛出则不回滚
- rollbackFor 未配置:默认只对
RuntimeException回滚,checked 异常不回滚
循环依赖——Spring 面试的"深水题"
A 依赖 B,B 又依赖 A——这就是循环依赖。Spring 通过三级缓存解决 Setter 注入的循环依赖:
| 缓存 | 名称 | 存储内容 |
|---|---|---|
| 一级缓存 | singletonObjects | 完全初始化完成的 Bean |
| 二级缓存 | earlySingletonObjects | 提前暴露的半成品 Bean |
| 三级缓存 | singletonFactories | Bean 的工厂对象(ObjectFactory) |
但三级缓存无法解决构造器注入的循环依赖——因为构造器注入时 Bean 还没创建出来,无法提前暴露。
学习建议
- IoC 容器 + DI → Spring 的核心理念
- Bean 生命周期 → 理解 Spring 管理对象的方式
- AOP → 代理原理、切面编程
- 事务管理 → 传播行为、事务失效
- 循环依赖 → 三级缓存原理
- Spring MVC → Web 请求处理流程