一、思维导图整体知识结构梳理
一、日志技术
- SpringBoot 日志
- 概念:记录程序运行信息,用于排查问题
- 门面:SLF4J
- 实现:Logback
- 日志级别 (由低→高):trace 追踪、debug 调试、info 普通信息、warn 警告、error 错误
- 使用方式
- 原始写法:LoggerFactory 获取 Logger 对象
- Lombok 简化:@Slf4j 注解,直接 log.xxx ()
- yml 配置
- logging.level:控制打印级别
- logging.file.name:输出日志到文件
- System.out.println:不推荐项目使用
- 日志体系
- 日志门面 (接口):SLF4J(主流,SpringBoot 首选)、JCL (Commons‑Logging)、老项目门面
- 日志实现 (日志框架,真正打印日志):Logback(SpringBoot 默认实现)、Log4j
- 搭配关系:SLF4J 门面 + Logback 实现;优势:解耦,切换日志框架无需修改业务代码
二、AOP 面向切面编程
- 方法增强
- 概念:在不修改原有业务方法源码的前提下,增加额外功能;原有核心业务代码保持不变
- 前置增强:方法执行之前;后置增强:方法正常执行完毕之后;异常增强:方法抛出异常执行;最终增强:无论成功失败都执行;环绕增强:完全控制原方法执行
- 底层实现技术:动态代理(目标类要有接口‑JDK 动态代理;目标类无接口‑CGLIB 动态代理,生成子类)
- Spring 实现方式:AOP 面向切面编程;高频场景:日志、事务、权限、性能计时
- AOP 核心术语
- 连接点 JoinPoint:可以被增强的所有方法
- 切入点 Pointcut:真正被增强的方法
- 通知 (Advice):额外增强的功能代码;5 种通知:@Before 前置通知、@AfterReturning 后置通知、@AfterThrowing 异常通知、@After 最终通知、@Around 环绕通知 (最强)
- 切面 Aspect = 切入点 + 通知
- 执行顺序:环绕前置→前置通知→目标方法→后置通知→最终通知→环绕后置
- 应用场景:日志记录、事务、权限校验、计时
- OOP 和 AOP 区别:OOP 面向对象:实现核心业务功能;AOP 面向切面:抽取通用公共功能;典型场景:接口日志打印、操作日志、事务控制、权限校验
- @Aspect 注解
- 作用:标记该类为切面类;必须配合 @Component 将切面交给 spring 容器管理;@Pointcut:切入点表达式,指定哪些方法被增强
- 常见错误:漏写 @Component,切面不生效
- 环绕通知 @Around
- 参数:必须携带 ProceedingJoinPoint
- proceed ():执行目标方法;执行顺序:前置代码→执行目标方法→后置代码;异常不捕获‑目标报错,切面不会运行后置代码
- @Around 环绕通知 VS 其他四种通知
- 参数区别、执行控制权区别、返回值、能力对比
- 环绕通知:可控制目标方法执行,全能;其余通知:单一时机执行
三、Spring 两大核心
- IOC 控制反转:作用:对对象交由 spring 容器创建管理;注解:@Component、@Service
- AOP 面向切面编程:作用:方法增强,不修改源码添加功能;注解:@Aspect、@Around、@Before
四、Spring AOP 通知类型
- @Around 环绕通知:目标方法前、后均可执行,功能最强,可以控制目标方法是否执行
- @Before 前置通知:在目标方法之前执行
- @After 最终通知:目标方法之后执行,有无异常,都会执行
- @AfterReturning 返回通知:目标方法正常结束后执行
- @AfterThrowing 异常通知:目标方法抛出异常后执行
五、向上转型 & 向下转型(回忆)
- 向上转型(多态):子类对象赋值给父类引用;自动转换,无需强制;只能调用父类方法;不能调用子类独有的方法;实现多态,代码扩展性强
- 向下转型:父类引用转成子类类型;需要强制类型转换;可以调用子类独有方法
六、多态
- 定位:面向对象三大特征之一:封装、继承、多态
- 必要条件:存在继承 / 实现关系、存在方法重写、父类引用指向子类对象
- 优点:代码易维护、通用;实现代码解耦,扩展性强
- 弊端:不能直接使用子类独有的功能;向下转型时,类型转换异常 ClassCastException;解决方案:转型前使用 instanceof 判断对象真实类型
- 核心口诀:编译看左边,运行看右边
七、切入点表达式 execution
- 语法格式:execution (返回值类型 包名。方法名 (参数))
- 示例详解:8 种完整写法,分别匹配不同包、类、方法、参数范围
- 逻辑运算符:&& 并且、|| 或者、! 非
- @Pointcut 注解
- 作用:抽取重复的切入点表达式;一处定义,多处复用;后期修改改一处即可
- 使用步骤:定义无返回值空方法;加上 @Pointcut;在通知注解引用该方法
二、思维导图制作意图
本次思维导图梳理 SpringBoot 日志技术与 AOP 切面编程两大核心板块,厘清 SLF4J 门面 + Logback 实现的日志体系;吃透 AOP 动态代理原理、五大通知类型、execution 切入点表达式语法、@Pointcut 复用技巧;顺带回顾 Java 多态、向上向下转型底层知识,打通 AOP 动态代理底层原理。将日志打印作为 AOP 实战场景,为后续使用 AOP 做操作日志、权限拦截打下基础。
三、当日学习总结
今天学习了 SpringBoot 日志框架的配置、分级打印以及 Lombok 简化日志开发;深入学习 AOP 面向切面编程,掌握 5 种通知、execution 切入点表达式书写、@Pointcut 切入点抽取复用;理解 AOP 基于动态代理实现方法无侵入式增强,以后就可以用 AOP 完成接口日志记录、方法计时、权限校验等通用功能;同时复习了多态与类型转换知识点,补齐 AOP 底层代理相关的 Java 基础。
