Spring知识梳理(4)

📅 2026/7/18 16:21:15
Spring知识梳理(4)
Spring知识梳理(4)作者没有四次元口袋的蓝胖日期2026-07-16标签Java, Spring, AOP, 面向切面编程一、AOP 是什么AOPAspect-Oriented Programming面向切面编程是对 OOP 的补充。OOP纵向继承解决类与类之间的复用封装、继承、多态AOP横向抽取解决跨多个类的公共行为复用日志、事务、权限、性能监控传统 OOP 的问题 UserService OrderService ProductService ↓ ↓ ↓ 日志代码 日志代码 日志代码 ← 重复 事务代码 事务代码 事务代码 ← 重复 权限代码 权限代码 权限代码 ← 重复 AOP 的解决方式 UserService OrderService ProductService ↓ ↓ ↓ ┌─────────┐ │ AOP 切面 │ ← 统一抽取一处维护 └─────────┘一句话总结AOP 把散落在各处的公共逻辑抽到一个地方统一管理不侵入业务代码。二、核心术语7 个必须分清术语英文含义例子切面Aspect横切关注点的模块化日志切面、事务切面连接点JoinPoint程序执行的某个点方法调用、异常抛出每个方法都是一个连接点切入点Pointcut你选择的哪些连接点要被增强execution(* service.*.*(..))通知增强Advice切入后做什么打日志、开事务目标对象Target被代理的原始对象UserService 实例代理对象ProxyAOP 生成的增强后的对象包含日志逻辑的 UserService织入Weaving把切面逻辑应用到目标对象的过程Spring 在运行时通过代理完成面试口诀切面 切入点 通知。切入点决定在哪里切入通知决定切入后做什么。连接点 vs 切入点最容易混淆连接点程序中所有可以被拦截的点所有方法是客观存在的切入点你实际选中的那些连接点是主观选择的所有方法 连接点全集 你选中的方法 切入点子集三、五种通知类型通知注解执行时机用途前置通知Before目标方法执行前参数校验、权限检查后置通知AfterReturning目标方法正常返回后日志记录环绕通知Around包裹目标方法执行事务管理、性能监控异常通知AfterThrowing目标方法抛出异常后异常处理、告警最终通知After目标方法执行后无论是否异常资源清理类似 finally执行顺序正常执行流程 Around 前半 → Before → 目标方法 → Around 后半 → AfterReturning → After 异常执行流程 Around 前半 → Before → 目标方法抛异常→ AfterThrowing → After注意After类似于finally无论正常返回还是异常都会执行。AfterReturning只在正常返回时执行。Around 为什么最强大Around(pointcut())publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{// 前置逻辑longstartSystem.currentTimeMillis();// 可以决定是否执行目标方法调不调 proceed()Objectresultpjp.proceed();// 不调用则目标方法不执行// 后置逻辑longcostSystem.currentTimeMillis()-start;System.out.println(耗时: costms);// 甚至可以修改返回值returnresult;}Around能做的事✅ 控制目标方法是否执行不调proceed()就行✅ 修改入参✅ 修改返回值✅ 捕获异常不让它传播其他四种通知做不到这些。四、Spring AOP 完整执行流程客户端调用 proxy.method() ↓ 代理对象拦截方法调用 ↓ 根据 Pointcut 匹配这个方法需要被增强吗 ├── 是 → 按通知类型执行增强逻辑 │ ├── Before │ ├── 目标方法 │ ├── AfterReturning / AfterThrowing │ └── After └── 否 → 直接调用目标对象的方法五、思维导图速览Spring AOP ├── 核心思想 │ ├── 横向抽取公共逻辑日志、事务、权限 │ ├── 不修改源代码运行时织入 │ └── 底层 动态代理下篇详解 │ ├── 7 个核心术语 │ ├── Aspect切面 Pointcut Advice │ ├── JoinPoint连接点 所有可拦截的点 │ ├── Pointcut切入点 你选中的连接点 │ ├── Advice通知 切入后做什么 │ ├── Target / Proxy / Weaving │ └── 关键区分连接点全集vs 切入点子集 │ ├── 五种通知 │ ├── Before前置 │ ├── AfterReturning后置 │ ├── Around环绕← 最强大控制执行流 │ ├── AfterThrowing异常 │ └── After最终类似 finally │ └── 执行顺序 ├── 正常Around前 → Before → 方法 → Around后 → AfterReturning → After └── 异常Around前 → Before → 方法抛异常 → AfterThrowing → After六、写在最后面试回答模板“AOP 是面向切面编程把散落在各处的公共逻辑统一抽取管理。核心概念有 7 个最重要的是切面 切入点 通知。切入点决定在哪里切入通知决定切入后做什么。通知有五种Around 最强大可以控制目标方法是否执行、修改入参和返回值。AOP 底层通过动态代理实现运行时生成代理对象。”学习建议7 个术语重点区分连接点 vs 切入点面试常考五种通知记住执行顺序理解 Around 为什么最强