跳到主要内容

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 从创建到销毁经历完整的生命周期:

  1. 实例化:通过构造器创建 Bean 实例
  2. 属性填充:注入依赖(@Autowired 等)
  3. Aware 回调:如 BeanNameAwareApplicationContextAware
  4. BeanPostProcessor 前置处理postProcessBeforeInitialization
  5. 初始化@PostConstructInitializingBean.afterPropertiesSet()init-method
  6. BeanPostProcessor 后置处理postProcessAfterInitialization(AOP 代理在此创建)
  7. 使用阶段
  8. 销毁@PreDestroyDisposableBean.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
三级缓存singletonFactoriesBean 的工厂对象(ObjectFactory)

但三级缓存无法解决构造器注入的循环依赖——因为构造器注入时 Bean 还没创建出来,无法提前暴露。


学习建议

推荐学习路径
  1. IoC 容器 + DI → Spring 的核心理念
  2. Bean 生命周期 → 理解 Spring 管理对象的方式
  3. AOP → 代理原理、切面编程
  4. 事务管理 → 传播行为、事务失效
  5. 循环依赖 → 三级缓存原理
  6. Spring MVC → Web 请求处理流程

相关链接