蜗牛学苑 Java 智能体学习 Day33|AOP 面向切面编程、日志技术思维导图复盘

一、思维导图整体知识结构梳理

一、日志技术

  1. SpringBoot 日志
    • 概念:记录程序运行信息,用于排查问题
    • 门面:SLF4J
    • 实现:Logback
    • 日志级别 (由低→高):trace 追踪、debug 调试、info 普通信息、warn 警告、error 错误
    • 使用方式
      1. 原始写法:LoggerFactory 获取 Logger 对象
      2. Lombok 简化:@Slf4j 注解,直接 log.xxx ()
    • yml 配置
    • System.out.println:不推荐项目使用
  2. 日志体系
    • 日志门面 (接口):SLF4J(主流,SpringBoot 首选)、JCL (Commons‑Logging)、老项目门面
    • 日志实现 (日志框架,真正打印日志):Logback(SpringBoot 默认实现)、Log4j
    • 搭配关系:SLF4J 门面 + Logback 实现;优势:解耦,切换日志框架无需修改业务代码

二、AOP 面向切面编程

  1. 方法增强
    • 概念:在不修改原有业务方法源码的前提下,增加额外功能;原有核心业务代码保持不变
    • 前置增强:方法执行之前;后置增强:方法正常执行完毕之后;异常增强:方法抛出异常执行;最终增强:无论成功失败都执行;环绕增强:完全控制原方法执行
    • 底层实现技术:动态代理(目标类要有接口‑JDK 动态代理;目标类无接口‑CGLIB 动态代理,生成子类)
    • Spring 实现方式:AOP 面向切面编程;高频场景:日志、事务、权限、性能计时
  2. AOP 核心术语
    • 连接点 JoinPoint:可以被增强的所有方法
    • 切入点 Pointcut:真正被增强的方法
    • 通知 (Advice):额外增强的功能代码;5 种通知:@Before 前置通知、@AfterReturning 后置通知、@AfterThrowing 异常通知、@After 最终通知、@Around 环绕通知 (最强)
    • 切面 Aspect = 切入点 + 通知
    • 执行顺序:环绕前置→前置通知→目标方法→后置通知→最终通知→环绕后置
    • 应用场景:日志记录、事务、权限校验、计时
    • OOP 和 AOP 区别:OOP 面向对象:实现核心业务功能;AOP 面向切面:抽取通用公共功能;典型场景:接口日志打印、操作日志、事务控制、权限校验
  3. @Aspect 注解
    • 作用:标记该类为切面类;必须配合 @Component 将切面交给 spring 容器管理;@Pointcut:切入点表达式,指定哪些方法被增强
    • 常见错误:漏写 @Component,切面不生效
  4. 环绕通知 @Around
    • 参数:必须携带 ProceedingJoinPoint
    • proceed ():执行目标方法;执行顺序:前置代码→执行目标方法→后置代码;异常不捕获‑目标报错,切面不会运行后置代码
  5. @Around 环绕通知 VS 其他四种通知
    • 参数区别、执行控制权区别、返回值、能力对比
    • 环绕通知:可控制目标方法执行,全能;其余通知:单一时机执行

三、Spring 两大核心

  • IOC 控制反转:作用:对对象交由 spring 容器创建管理;注解:@Component、@Service
  • AOP 面向切面编程:作用:方法增强,不修改源码添加功能;注解:@Aspect、@Around、@Before

四、Spring AOP 通知类型

  1. @Around 环绕通知:目标方法前、后均可执行,功能最强,可以控制目标方法是否执行
  2. @Before 前置通知:在目标方法之前执行
  3. @After 最终通知:目标方法之后执行,有无异常,都会执行
  4. @AfterReturning 返回通知:目标方法正常结束后执行
  5. @AfterThrowing 异常通知:目标方法抛出异常后执行

五、向上转型 & 向下转型(回忆)

  1. 向上转型(多态):子类对象赋值给父类引用;自动转换,无需强制;只能调用父类方法;不能调用子类独有的方法;实现多态,代码扩展性强
  2. 向下转型:父类引用转成子类类型;需要强制类型转换;可以调用子类独有方法

六、多态

  • 定位:面向对象三大特征之一:封装、继承、多态
  • 必要条件:存在继承 / 实现关系、存在方法重写、父类引用指向子类对象
  • 优点:代码易维护、通用;实现代码解耦,扩展性强
  • 弊端:不能直接使用子类独有的功能;向下转型时,类型转换异常 ClassCastException;解决方案:转型前使用 instanceof 判断对象真实类型
  • 核心口诀:编译看左边,运行看右边

七、切入点表达式 execution

  1. 语法格式:execution (返回值类型 包名。方法名 (参数))
  2. 示例详解:8 种完整写法,分别匹配不同包、类、方法、参数范围
  3. 逻辑运算符:&& 并且、|| 或者、! 非
  4. @Pointcut 注解
    • 作用:抽取重复的切入点表达式;一处定义,多处复用;后期修改改一处即可
    • 使用步骤:定义无返回值空方法;加上 @Pointcut;在通知注解引用该方法

二、思维导图制作意图

本次思维导图梳理 SpringBoot 日志技术与 AOP 切面编程两大核心板块,厘清 SLF4J 门面 + Logback 实现的日志体系;吃透 AOP 动态代理原理、五大通知类型、execution 切入点表达式语法、@Pointcut 复用技巧;顺带回顾 Java 多态、向上向下转型底层知识,打通 AOP 动态代理底层原理。将日志打印作为 AOP 实战场景,为后续使用 AOP 做操作日志、权限拦截打下基础。

三、当日学习总结

今天学习了 SpringBoot 日志框架的配置、分级打印以及 Lombok 简化日志开发;深入学习 AOP 面向切面编程,掌握 5 种通知、execution 切入点表达式书写、@Pointcut 切入点抽取复用;理解 AOP 基于动态代理实现方法无侵入式增强,以后就可以用 AOP 完成接口日志记录、方法计时、权限校验等通用功能;同时复习了多态与类型转换知识点,补齐 AOP 底层代理相关的 Java 基础。

相关推荐
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本4 天前
离散数学第六课
学习·离散数学
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊4 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope4 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统