Spring AOP核心机制:代理与拦截揭秘
在 Spring 开发中我们经常使用Transactional、日志切面等功能但很多人并不清楚它们是如何工作的。本质上这些能力都建立在Spring AOP之上。本文面向准备后端校招面试的同学聚焦以下核心问题AOP 的设计初衷是什么为什么不能只用工具类Spring AOP 如何通过动态代理实现“织入”代理对象在 Bean 生命周期中何时创建为什么this.method()调用会导致 AOP 或事务失效不展开 AspectJ 或字节码生成细节只讲清Spring AOP 在面试中最常被考察的核心机制。一、什么是 AOPAOPAspect Oriented Programming即面向切面编程。在实际开发中一个业务方法往往不仅包含核心逻辑还会混入一些通用逻辑例如public void createOrder() { // 记录日志 log.info(create order); // 权限校验 checkPermission(); // 事务控制 beginTransaction(); orderService.save(); commitTransaction(); }这些逻辑具有共同特点与核心业务无关在多个方法中重复出现AOP 的目标就是将这类横切关注点Cross-Cutting Concerns从业务代码中抽离形成统一的切面Aspect。常见应用场景包括日志记录事务管理权限校验性能监控二、Spring AOP 的核心概念理解 Spring AOP 需要掌握几个基本术语概念说明Aspect切面封装横切逻辑的类Advice通知具体的增强行为Pointcut切点定义哪些方法会被拦截JoinPoint连接点程序执行过程中的某个点如方法调用Proxy代理对象用于拦截方法调用简单流程方法调用 ↓ 切点匹配 ↓ 代理对象拦截 ↓ 执行通知Advice三、Spring AOP 的基本使用在 Spring 中使用 AOP 非常直接。例如定义一个日志切面Aspect Component public class LogAspect { Before(execution(* com.demo.service.*.*(..))) public void before() { System.out.println(before method); } }当调用orderService.createOrder()时Spring 会自动在方法执行前插入日志逻辑。但关键问题是Spring 是如何把切面“织入”到业务方法中的答案是代理对象。四、Spring AOP 的实现机制Spring AOP 的底层基于动态代理主要有两种方式代理方式适用条件JDK 动态代理目标类实现了接口CGLIB 代理目标类没有接口Spring 的默认策略是优先使用 JDK 动态代理若无接口则使用 CGLIB。代理对象的调用结构如下客户端 ↓ 代理对象Proxy ↓ 拦截器链Interceptor Chain ↓ 目标对象Target所有方法调用实际上都经过代理对象从而有机会执行切面逻辑。五、代理对象是什么时候创建的这是理解 Spring AOP 的关键。很多人误以为代理在 Bean 实例化时就生成了实际上代理是在 Bean 初始化完成之后通过BeanPostProcessor创建的。具体生命周期流程1. 实例化 Bean 2. 依赖注入populate 3. 初始化InitializingBean / init-method 4. BeanPostProcessor.postProcessAfterInitialization() 5. → 此时判断是否需要创建代理核心实现类是AbstractAutoProxyCreator其postProcessAfterInitialization()方法中调用wrapIfNecessary(bean, beanName)若当前 Bean 匹配任意切点则为其创建代理对象。六、AOP 方法调用的执行流程当客户端调用方法时实际执行路径为客户端调用 ↓ 代理对象.invoke() ↓ ReflectiveMethodInvocation.proceed() ↓ 遍历拦截器链MethodInterceptor ↓ 依次执行 Before、Around 等 Advice ↓ 最终调用目标方法Spring 将多个通知封装为一个拦截器链Interceptor Chain通过责任链模式依次执行。七、为什么内部调用this.method()会导致 AOP 失效这是校招面试高频问题。Service public class OrderService { public void methodA() { this.methodB(); // 内部调用 } Transactional public void methodB() { // 数据库操作 } }此时Transactional不会生效。原因在于Spring AOP 是基于代理实现的只有通过代理对象的方法调用才会触发切面逻辑。而this.methodB()是直接调用目标对象的方法绕过了代理因此事务或其他 AOP 逻辑不会被织入。解决思路包括将methodB拆到另一个 Service 中通过自注入获取代理实例Autowired private OrderService self;八、Spring AOP 整体流程回顾将上述环节串联起来1. 容器启动扫描 Aspect 注解 2. 注册 AbstractAutoProxyCreatorBeanPostProcessor 3. Bean 初始化完成后判断是否匹配切点 4. 若匹配创建代理对象JDK / CGLIB 5. 后续方法调用通过代理进入拦截器链 6. 执行通知逻辑再调用目标方法九、面试回答参考如果面试官问“Spring AOP 是如何实现的”可参考如下回答Spring AOP 基于动态代理实现。在 Bean 初始化完成后Spring 通过BeanPostProcessor具体是AbstractAutoProxyCreator判断该 Bean 是否匹配切面定义。如果匹配则为其创建代理对象有接口用 JDK 代理无接口用 CGLIB。后续对该 Bean 的方法调用实际是调用代理对象的方法代理会将通知封装为拦截器链在目标方法执行前后插入增强逻辑。需要注意的是只有通过代理对象的调用才会触发 AOP内部调用如this.xxx()会绕过代理导致切面失效。十、总结Spring AOP 的核心机制可归纳为三点基于动态代理JDK / CGLIB实现运行时织入代理对象在BeanPostProcessor.postProcessAfterInitialization()阶段创建只有通过代理对象的方法调用才会进入拦截器链并执行切面逻辑。理解这三点就能解释包括Transactional失效在内的大多数 AOP 相关面试问题。欢迎在评论区交流你在 AOP 或 Spring 面试中遇到的问题。如果你觉得本文帮你理清了原理脉络欢迎点赞或收藏方便面试前快速回顾。

相关新闻

学校官网CKEditor需要哪些Word图文处理功能?

学校官网CKEditor需要哪些Word图文处理功能?

Word图片一键转存功能开发纪实:从组件调研到全栈落地 一、需求背景与技术选型 作为北京某科技公司的全栈开发,近期接到企业文档管理系统的核心需求:实现Word/Excel/PPT/PDF文档的智能解析,提取其中图片并自动上传至阿里云OSS&am…

2026/5/17 10:25:20 阅读更多 →
【已解决】ollama导入微调后的gguf模型后胡说八道

【已解决】ollama导入微调后的gguf模型后胡说八道

【背景】我使用llamafactory这个框架LoRA了微调了Qwen3-8B这个纯文本的大模型,并将LoRA权重和原始的模型权重合并得到最终的模型。然后使用llama.cpp将合并后的权重转换为gguf格式,使用llama.cpp部署这个转换后的gguf模型使用没有问题,根据模…

2026/5/17 10:25:19 阅读更多 →
【Linux】nmcli命令详解

【Linux】nmcli命令详解

目录 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ?编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ?编辑1.显示所有网络连接 2.显示某个网卡的详细信息…

2026/7/3 7:19:50 阅读更多 →

最新新闻

3步搭建个人哔咔漫画离线图书馆:告别网络卡顿,下载速度提升300%

3步搭建个人哔咔漫画离线图书馆:告别网络卡顿,下载速度提升300%

3步搭建个人哔咔漫画离线图书馆:告别网络卡顿,下载速度提升300% 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: htt…

2026/7/5 5:21:40 阅读更多 →
MySQL数据视图学习笔记

MySQL数据视图学习笔记

1. 什么是视图?视图是数据库的虚拟表,不存储真实数据,仅保存一条预编译的SELECT查询语句。每次查询视图时,数据库会动态执行这条SQL,从关联的底层数据表中实时计算并返回结果。视图相当于给底层数据表开了一扇“观景窗…

2026/7/5 5:19:36 阅读更多 →
DDrawCompat完整指南:如何让经典Windows游戏在现代系统上流畅运行

DDrawCompat完整指南:如何让经典Windows游戏在现代系统上流畅运行

DDrawCompat完整指南:如何让经典Windows游戏在现代系统上流畅运行 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirror…

2026/7/5 5:19:36 阅读更多 →
MyBatis是什么?MyBatis-Plus是什么?

MyBatis是什么?MyBatis-Plus是什么?

MyBatis是什么?一款 持久层 框架持久层是什么?软件分层架构中,负责实现数据持久化、专门与数据库交互的层级框架是什么?一套封装了底层通用逻辑、提供统一开发规范的半成品程序(开发人员在这套半成品程序上继续开发自己…

2026/7/5 5:17:36 阅读更多 →
OfflineInsiderEnroll:Windows Insider计划的终极离线管理解决方案

OfflineInsiderEnroll:Windows Insider计划的终极离线管理解决方案

OfflineInsiderEnroll:Windows Insider计划的终极离线管理解决方案 【免费下载链接】offlineinsiderenroll OfflineInsiderEnroll - A script to enable access to the Windows Insider Program on machines not signed in with Microsoft Account 项目地址: http…

2026/7/5 5:13:35 阅读更多 →
Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具

Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具

Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经在macOS…

2026/7/5 5:11:35 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻