一直以来都是和Java后台对接接口,想着自己要是能给自己写接口是不是更方便了,所以觉得学学Java。 计划从SpringBoot学起,跟着视频课先大致学习一遍。从今天起开始记录学习过程。可能学的过程有些问题,可能要麻烦大家一起帮我解答。 慢慢来,一步步来,徐徐图之。
概念篇
大概了解一下相关概念,查了资料,似懂非懂的感觉
Spring核心: IOC和AOP
IOC是什么?
Spring IOC(Inversion of Control,控制反转)是 Spring 框架的核心特性之一。
- 概念:
在传统的软件开发中,对象的创建和依赖关系的管理通常由程序自身负责。例如,在一个类中需要使用另一个类的实例时,往往会在该类内部直接使用
new关键字来创建依赖对象。而 Spring IOC 改变了这种方式,它将对象的创建、初始化、销毁等生命周期管理的控制权从应用程序代码转移到了 Spring 容器中。也就是说,由 Spring 容器来负责对象的创建和依赖关系的注入,应用程序只需要使用这些对象即可,这就是所谓的 “控制反转”。 自己理解就是不用依赖的对象不用new的方式,而是用配置文件管理依赖对象了。 - 实现方式:
- 依赖注入
- 依赖查找
- Spring IOC 的优势
- 降低耦合度:对象之间的依赖关系由 Spring 容器来管理,使得对象之间的耦合度大大降低。当需要更换依赖对象时,只需要在 Spring 配置文件中进行修改,而不需要修改应用程序代码。
- 提高可测试性:由于对象的依赖关系可以通过配置文件进行管理,因此在进行单元测试时,可以很方便地替换依赖对象,使用模拟对象进行测试。
- 便于维护和扩展:当系统需要添加新的功能或修改现有功能时,只需要在 Spring 配置文件中进行相应的修改,而不需要对大量的代码进行修改,提高了系统的可维护性和可扩展性。
- 实现了对象的生命周期管理:Spring 容器负责对象的创建、初始化、销毁等生命周期管理,使得开发人员可以专注于业务逻辑的实现,而不需要关心对象的生命周期管理问题。
AOP是什么?
这个概念我查了好多文章,读过后感觉可能因为我的水平不行理解都不太透彻,于是我问了DeepSeek。它通过创设一个场景来做解释,非常有助于理解这个概念:
场景设定:开一家奶茶店
假设你开了一家奶茶店,核心业务是 “做奶茶” ,但除了做奶茶,你还需要处理一些重复性杂务,比如:
- 记录每杯奶茶的订单(日志)
- 检查顾客是否付了钱(权限验证)
- 打扫台面卫生(资源清理)
- 处理顾客投诉(异常处理)
如果用传统方式(OOP),你的奶茶师傅每做一杯奶茶,都得自己处理这些杂务,代码可能长这样:
public void 做奶茶() {
// 1. 记录订单
System.out.println("记录:开始做奶茶");
// 2. 检查是否付钱
if (!检查付钱()) {
throw new RuntimeException("没付钱!");
}
// 3. 核心业务:做奶茶
System.out.println("🥤 做一杯珍珠奶茶");
// 4. 打扫卫生
System.out.println("打扫台面");
// 5. 处理异常
try {
// ... 其他操作
} catch (Exception e) {
System.out.println("处理投诉");
}
}
这样写的问题:杂务代码和核心业务代码混在一起,如果杂务逻辑要修改(比如记录订单的格式),需要改所有奶茶师傅的代码,非常麻烦!
AOP 的解决方案
AOP 的思路是:雇一个“奶茶店管家” ,专门帮你处理所有杂务,让奶茶师傅只专注做奶茶。
1. 管家的职责(切面 Aspect)
管家负责处理所有杂务,比如:
- 记录订单(日志)
- 检查付钱(权限)
- 打扫卫生(资源清理)
- 处理投诉(异常)
2. 管家如何工作?
管家通过**“动态代理”**技术,在以下时机自动介入:
- 做奶茶前:检查付钱、记录订单(前置通知
@Before) - 做奶茶后:打扫台面(后置通知
@After) - 奶茶做砸了:处理顾客投诉(异常通知
@AfterThrowing) - 奶茶做好时:问顾客要不要加小料(返回后通知
@AfterReturning)
3. 代码变得简洁
奶茶师傅的代码只需关注核心业务
public void 做奶茶() {
// 核心业务:做奶茶
System.out.println("🥤 做一杯珍珠奶茶");
}
所有杂务由管家(AOP)自动处理,且可以统一管理!
AOP 的核心概念
| 术语 | 奶茶店比喻 | 实际含义 |
|---|---|---|
| 切面(Aspect) | 奶茶店管家 | 封装横切逻辑(如日志、权限)的模块 |
| 连接点(JoinPoint) | 做奶茶、做咖啡、做蛋糕 | 程序执行的点(如方法调用) |
| 通知(Advice) | 管家在何时做何事 | 切面在连接点的具体动作(如@Before) |
| 切点(Pointcut) | 只拦截“做奶茶”方法 | 定义哪些连接点会被切面拦截的表达式 |
AOP 的典型应用场景
- 日志记录:自动记录每个方法的入参和结果。
- 事务管理:方法开始前开启事务,结束后提交或回滚。
- 权限校验:在方法执行前检查用户权限。
- 性能监控:统计方法耗时。
- 异常处理:统一捕获并处理异常。
总结
AOP 就像雇了一个管家,把重复性杂务(日志、事务等)从核心业务中剥离出来,让代码更干净、更易维护。你只需要告诉管家:“在店员做奶茶前后,帮我做这些事”,剩下的交给 Spring 的 AOP 机制自动完成!