Spring 核心原理(通俗易懂完整版)
Spring 是 Java 最主流的轻量级分层开源框架,核心目的:解耦、简化开发、统一管理对象、统一增强功能。
Spring 所有原理只围绕两大核心:IOC 容器、AOP 切面。
一、IOC 控制反转(Spring 灵魂核心)
- 什么是 IOC?
传统开发:程序员主动 new 对象、管理依赖(控制权在程序代码)。
Spring IOC:把对象的创建、依赖管理、生命周期全部交给 Spring 容器,程序员只管使用,不用手动 new。
控制权 从程序员反转给容器 → 控制反转 IOC。 - DI 依赖注入(IOC 的实现方式)
IOC 是思想,DI 是落地手段。
当一个类需要另一个类对象时,Spring 自动帮你注入依赖,不用自己创建。
三种注入方式:
- 构造器注入(Spring 官方推荐)
- setter 注入
- 字段注解注入(@Autowired)
- IOC 底层执行流程
- 启动项目,Spring 扫描所有带注解的类(@Component、@Service、@Controller 等)
- 解析配置,生成 BeanDefinition(对象模板信息)
- 容器根据模板 反射创建 Bean 对象
- singleton 单例(默认):整个容器只创建一个对象
- prototype 多例:每次获取都新建对象
- request / session:web 专属作用域
- Bean 完整生命周期(面试必背)
实例化 → 填充属性 → 前置处理 → 初始化 → 后置处理 → 销毁 - 通过反射 实例化对象
- 依赖注入(赋值、装配依赖)
- 执行 Bean 前置处理器(BeanPostProcessor before)
- 执行初始化方法(@PostConstruct / init-method)
- 执行后置处理器(after,AOP 代理在这里生成)
- Bean 就绪,进入容器使用
- 容器关闭,执行销毁方法
重点:AOP 代理对象,是在 Bean 初始化之后、放入容器之前生成的。
二、AOP 面向切面编程
- 什么是 AOP
不修改原有业务代码,对方法进行增强,实现:日志、事务、权限、限流、异常统一处理。
核心思想:业务逻辑与公共逻辑解耦。 - AOP 核心术语
- 切点 Pointcut:要拦截的哪些方法
- 通知 Advice:拦截后要执行的增强代码(前置、后置、环绕、异常、最终)
- 切面 Aspect:切点 + 通知的整体
- 连接点 JoinPoint:被拦截的方法
- AOP 底层原理:动态代理
Spring AOP 不用改源码,靠代理实现增强:
- 有接口:JDK 动态代理(基于接口)
- 无接口:CGLIB 动态代理(基于子类继承)
SpringBoot 2.x 默认全部使用 CGLIB。
- AOP 执行顺序
前置通知 → 执行目标方法 → 后置正常通知 / 异常通知 → 最终通知
三、Spring 整体架构
Spring 核心四层:
- Core 核心层:基础工具、通用资源
- Beans 组件层:Bean 工厂、对象管理
- Context 上下文层:完整 IOC 容器、事件、环境配置
- SpEL 表达式:动态取值解析
扩展能力:AOP、事务、Web、JDBC、缓存等全部基于核心容器扩展。
四、Spring 为什么好用(核心价值总结)
- 彻底解耦:IOC 消除大量 new 对象、硬依赖
- 无侵入增强:AOP 不用改业务代码就能加事务、日志
- 统一对象管理:生命周期统一、单例可控
- 简化开发:封装 JDBC、事务、资源管理
- 高度可扩展:插件化、可自定义后置处理器
五、一句话终极总结
Spring = IOC 容器统一管理所有对象 + AOP 动态增强所有方法,实现代码解耦、优雅、可扩展、易维护。