Spring 是 Java 企业级开发最主流的开源框架,核心设计目标是简化 Java 应用开发,解决传统代码耦合严重对象管理繁琐的问题,两大核心思想就是 IoC 控制反转和 AOP 面向切面编程,整个框架并不是单一的 jar 包,而是一套完整生态,包含 Spring 核心容器 SpringMVC SpringBoot SpringCloud 等模块,传统原生 Java 开发需要程序员自己 new 对象,对象之间依赖关系全部写死,业务改动的时候代码改动量大,Spring 把对象创建和依赖注入交给 Spring 容器统一管理,也就是 IoC,AOP 则是把日志事务权限这类和业务无关的公共代码抽离出来,动态织入到目标方法,不需要修改原有业务代码,现在绝大多数 Java 后端项目都是基于 Spring 体系开发,新手学习 Spring 不能只停留在会写注解,需要理解容器 Bean 生命周期代理机制,再逐步过渡到 SpringBoot 自动装配,理解 Spring 为什么能成为 Java 后端开发的标准框架。
一 Spring 核心基础概念
1 IoC 控制反转
传统写法是程序主动创建依赖对象,控制反转就是把对象控制权反转,交给 Spring 容器,容器负责实例化 Bean 管理 Bean 之间依赖,通过依赖注入 DI 完成对象赋值,注入方式有构造器注入 Setter 注入字段注入三种,IoC 最大优势就是解耦,对象不再硬编码依赖,方便测试替换组件。
2 Bean
Bean 就是被 Spring 容器管理的 Java 对象,普通类加上注解或者在配置文件注册之后,就变成 Bean,Bean 默认单例,也就是整个容器只有一份实例,也可以修改作用域,比如 prototype 每次获取都创建新对象,还有 request session 这类 web 环境作用域。
3 AOP 面向切面编程
AOP 是对 OOP 面向对象的补充,把横切关注点独立出来,比如事务管理日志打印权限校验,底层实现是动态代理,JDK 动态代理针对实现接口的类,CGLIB 代理不需要接口直接代理类,通过切面切点通知,在方法执行前执行后异常抛出的时候执行增强逻辑,Spring 声明式事务底层就是依靠 AOP 实现。
二 Spring 核心模块介绍
1 spring-core 核心模块
提供 IoC 容器基础功能,BeanFactory 是最基础容器接口,ApplicationContext 是 BeanFactory 的增强实现,增加国际化事件资源加载等能力,日常开发使用的 ApplicationContext。
2 spring-context 上下文模块
基于 core 模块,实现应用上下文,支持事件监听注解配置 Bean 管理,是容器运行核心模块。
3 spring-aop 切面模块
实现 AOP 相关功能,定义切面切点通知,支持动态代理织入。
4 spring-web 与 spring-webmvc
SpringMVC 属于 Spring 体系里面的 Web 层框架,用来处理浏览器请求,核心组件是 DispatcherServlet 前端控制器,接收请求,映射到 Controller,处理参数校验返回视图或者 JSON,现在前后端分离项目主要返回 JSON 数据。
5 spring-tx 事务模块
提供声明式事务和编程式事务,也就是大家熟悉的 @Transactional 注解,依靠 AOP 代理实现事务提交回滚,是业务数据库操作必备模块。
三 传统 Spring 配置方式
早期 Spring 使用 xml 配置文件,在 xml 里面定义 Bean 标签,配置属性依赖,后面注解方式成为主流,常用注解有 @Component @Service @Controller @Repository @Autowired @Qualifier @Value,@Component 是通用组件注解,@Service 标注业务层,@Controller 标注 web 控制器,@Repository 标注数据访问层,本质全部都是 @Component 衍生注解,作用都是注册 Bean。
四 SpringBoot 和原生 Spring 的关系
很多新手容易混淆 Spring 和 SpringBoot,SpringBoot 不是替换 Spring,而是在 Spring 基础之上做自动装配,约定优于配置,根据类路径依赖自动创建 Bean,省去大量 xml 和手动配置,内嵌 Tomcat 服务器,项目可以直接运行,不需要单独部署 war 包到外部容器,SpringBoot 底层依然是 Spring IoC 和 AOP,核心原理没有改变,只是简化配置,快速搭建 Spring 项目。
五 核心组件对照表
| 模块 | 核心功能 | 核心注解或者接口 |
|---|---|---|
| 核心容器 | Bean 创建依赖注入 | ApplicationContext BeanFactory |
| AOP | 切面动态代理 | @Aspect @Pointcut @Around |
| 事务 | 数据库事务管理 | @Transactional |
| SpringMVC | 请求处理 | @Controller @RequestMapping |
| SpringBoot | 自动装配 | @SpringBootApplication |
六 学习 Spring 框架的步骤
第一步先理解 IoC 和 DI 思想,写最简单 demo,手动创建 ApplicationContext,注册 Bean,观察容器创建对象过程,理解为什么要控制反转。
第二步学习 Bean 生命周期,实例化属性填充初始化销毁,理解 Bean 后置处理器的作用。
第三步学习 AOP,写日志切面,区分 JDK 动态代理和 CGLIB 代理,理解声明式事务底层原理。
第四步学习 SpringMVC,理解 DispatcherServlet 请求流转完整流程,参数绑定异常处理。
第五步过渡 SpringBoot,学习自动装配原理 starter 机制,整合 MyBatis 数据库,做完整业务项目。
第六步进阶学习 Spring 高级特性,事件机制循环依赖解决 Bean 作用域,排查 Spring 项目常见报错,比如 Bean 找不到循环依赖事务失效。
总结,Java 中的 spring 框架核心就是 IoC 容器和 AOP 两大基石,在此基础扩展 Web 事务等模块,后续 SpringBoot 只是简化配置的增强封装,学习的时候优先吃透底层原理,不要只会写注解,理解容器代理机制之后,才能解决开发当中 Bean 注入失败事务失效循环依赖这类常见问题,真正掌握 Spring 框架。
【常见问题】
问题 1 Java 中的 spring 框架,IoC 和 DI 是同一个概念吗
回答 1 Java 中的 spring 框架里面,IoC 是设计思想,也就是把对象控制权交给容器,DI 依赖注入是 IoC 的实现手段,容器把依赖对象注入到 Bean 里面,两者不是完全等同,DI 是实现 IoC 的方式。
问题 2 Java 中的 spring 框架,@Transactional 为什么会出现事务失效
回答 2 Java 中的 spring 框架里面,@Transactional 底层依靠 AOP 动态代理实现事务,如果同类内部方法直接调用没有经过代理对象,或者异常类型不匹配私有方法调用,就会导致事务失效,这是 Spring 框架高频踩坑点。
问题 3 Java 中的 spring 框架,SpringBoot 是不是独立于 Spring 的新框架
回答 3 Java 中的 spring 框架里面,SpringBoot 并不是独立新框架,它是基于 Spring 核心体系,采用自动装配约定优于配置,简化 Spring 项目搭建,底层仍然使用 Spring 的 IoC 容器和 AOP 机制。
问题 4 Java 中的 spring 框架,Bean 默认作用域是什么
回答 4 Java 中的 spring 框架里面,Bean 默认作用域是单例 singleton,整个 Spring 容器只会创建一个 Bean 实例,多线程环境使用单例 Bean 要注意成员变量带来的线程安全问题。
【免责申明】
本文内容基于主流 Spring5 SpringBoot 版本原理整理,Spring 版本迭代之后部分实现细节会有调整,本文仅作为 Java 学习参考,不代表所有版本源码完全一致,生产项目请结合对应版本源码验证,不构成强制技术选型建议。


