Spring框架学习系列:
- 《Spring框架学习(一):从设计思想到核心架构全面认识Spring》
- 《Spring框架学习(二):IOC核心原理与Bean创建流程》
- 《Spring框架学习(三):Spring Bean生命周期源码解析》
- 《Spring框架学习(四):Spring AOP动态代理实现原理》
- 《Spring框架学习(五):Spring MVC请求处理流程解析》
- 《Spring框架学习(六):Spring事务实现原理》
- 《Spring框架学习(七):Spring Boot自动配置原理》
- 《Spring框架学习(八):Spring源码整体流程总结》
一、前言
在 Java 后端开发领域,Spring 框架几乎是每个 Java 开发者都绕不开的技术。
无论是传统单体项目,还是现在流行的微服务架构:
- Spring MVC
- Spring Boot
- Spring Cloud
- Spring Security
- Spring Data
都建立在 Spring Framework 的基础之上。
但是很多初学者学习 Spring 时,往往会陷入一个误区:
只会使用注解,却不了解 Spring 为什么这样设计。
例如:
@Autowired
private UserService userService;
很多开发者知道它可以自动注入对象,但是不知道:
- 对象是谁创建的?
- 为什么可以自动找到?
- Spring 如何管理对象生命周期?
- 注解背后的实现原理是什么?
因此,学习 Spring 不能只停留在使用层面,更应该理解它背后的设计思想。
本文作为 Spring 学习系列第一篇,将从整体角度认识 Spring。
二、Spring是什么?
2.1 Spring简介
Spring 是一个开源的 Java 企业级开发框架。
它最初由 Rod Johnson 在 2003 年提出。
Spring 的核心目标:
简化 Java 企业级应用开发。
在 Spring 出现之前,Java 企业开发主要依赖 EJB(Enterprise JavaBeans)。
虽然 EJB 提供了企业级能力,但是存在很多问题:
- 学习成本高
- 配置复杂
- 代码耦合严重
- 测试困难
Spring 的出现,就是为了提供一种更加简单、灵活的开发方式。
三、Spring解决了什么问题?
在传统 Java 开发中,一个类经常需要主动创建其他对象。
例如:
public class UserController {
private UserService userService =
new UserServiceImpl();
}
这里存在一个问题:
UserController 和 UserServiceImpl 强耦合。
如果以后需要替换实现:
UserServiceV2Impl
就必须修改代码。
当项目规模越来越大:
- 类越来越多
- 依赖关系越来越复杂
代码维护成本会越来越高。
Spring 主要解决三个核心问题:
1. 降低对象之间的耦合
通过 IOC(控制反转)
让对象创建交给 Spring 管理。
以前:
程序主动创建对象
现在:
Spring创建对象
程序直接使用
2. 提高代码复用能力
通过 AOP(面向切面编程)
将公共逻辑抽离。
例如:
系统中很多地方需要:
- 日志记录
- 权限验证
- 事务控制
以前:
每个方法重复编写。
现在:
统一交给切面处理。
3. 简化企业开发
Spring 提供大量基础能力:
例如:
- 数据访问
- 事务管理
- Web开发
- 安全认证
开发者只需要关注业务代码。
四、Spring核心设计思想
Spring 最核心的两个思想:
1. IOC(控制反转)
2. AOP(面向切面编程)
这两个思想贯穿整个 Spring。
五、IOC:控制反转
5.1 什么是IOC?
IOC:Inversion of Control
中文:控制反转。
简单理解:
将对象的创建和管理权交给 Spring 容器。
以前:
UserService service =
new UserServiceImpl();
对象由开发者创建。
Spring:
@Autowired
private UserService service;
对象由 Spring 创建并注入。
这种控制权的转移:就是控制反转。
5.2 IOC带来的好处
降低耦合
例如:
接口:
public interface UserService {
}
实现:
public class UserServiceImpl
implements UserService{
}
Controller:
@Autowired
private UserService userService;
Controller 不关心具体实现。
未来替换:
UserServiceV2Impl
不需要修改业务代码。
六、DI:依赖注入
很多人会混淆:IOC 和 DI。
实际上:
IOC 是思想。
DI 是实现方式。
DI:Dependency Injection 依赖注入。
例如:
UserController 依赖 UserService。
Spring 自动:
常见方式:
属性注入
@Autowired
private UserService userService;
构造方法注入
public UserController(
UserService userService){
this.userService=userService;
}
现在企业开发更加推荐:构造方法注入。
原因:
- 依赖关系明确
- 方便测试
- 避免空指针
七、AOP:面向切面编程
7.1 为什么需要AOP?
假设一个系统:100个接口。
每个接口都需要:
- 记录日志
- 校验权限
- 开启事务
如果每个方法都写:
log();
checkPermission();
beginTransaction();
会产生大量重复代码。
AOP就是解决这个问题。
7.2 AOP核心思想
将公共功能从业务代码中抽离。
例如:
业务代码:
public void save(){
userDao.save();
}
日志代码:
@Before("save()")
public void log(){
}
执行:
请求
↓
AOP代理
↓
日志处理
↓
业务方法
八、Spring整体架构
Spring Framework主要由以下模块组成:
Spring Framework
|
————————————————
| | | | |
Core Beans Context AOP MVC
1. Spring Core
核心模块。
提供:
- IOC
- DI
是整个 Spring 的基础。
2. Spring Beans
负责:
- Bean创建
- Bean管理
- Bean生命周期
3. Spring Context
提供:
ApplicationContext。
它是开发中最常使用的容器。
4. Spring AOP
提供:
面向切面编程。
5. Spring MVC
用于:
Web开发。
例如:
@Controller
@RequestMapping
@GetMapping
九、Spring生态体系
现在企业开发中,很少只使用 Spring Framework。
通常:
Spring Framework
↓
Spring Boot
↓
Spring Cloud
↓
微服务体系
Spring Framework
核心能力:
- IOC
- AOP
- MVC
Spring Boot
解决:
Spring配置复杂的问题。
特点:
- 自动配置
- 快速启动
- 内嵌服务器
例如:
以前需要大量XML配置。
现在:
一个启动类:
@SpringBootApplication
public class Application{
}
即可运行。
Spring Cloud
用于微服务开发。
提供:
- 服务注册
- 配置中心
- 网关
- 服务调用
十、Spring学习路线
学习 Spring 推荐按照以下顺序:
第一阶段:
Spring基础思想
IOC
DI
AOP
↓
第二阶段:
Bean生命周期
源码分析
事务原理
↓
第三阶段:
Spring MVC
Spring Boot
↓
第四阶段:
Spring Cloud
微服务架构
十一、总结
Spring 并不是简单的一个框架,而是一套完整的企业级开发体系。
它最核心的思想:
IOC解决对象管理问题。
DI实现对象之间的自动依赖。
AOP解决公共逻辑复用问题。
理解 Spring不要只记:
@Autowired
更重要的是理解:
对象如何创建?
对象如何管理?
依赖如何注入?
功能如何扩展?
掌握这些基础之后,后续学习:
- Spring IOC源码
- Bean生命周期
- Spring AOP
- Spring MVC
- Spring Boot自动配置
都会更加容易。

