我精心收集了一份10万字的java全面知识总结,包括了java几乎所有的面试基础解读,有兴趣可以获取看看
领取方式
https://pan.quark.cn/s/4e6e3d03407a
一、AOP 是什么
AOP,全称 Aspect Oriented Programming,中文叫面向切面编程。主要用来处理“横切关注点”。
横切关注点指的不是业务本身,而是业务方法中经常重复的部分,比如:日志、权限校验、异常处理、事务管理等。这些逻辑和业务无关,却经常出现在业务代码里,混在一起,容易让代码变得冗杂,不易维护。
AOP 的作用就是把这些重复的、分散的逻辑抽出来集中处理,业务逻辑不需要再关心这些细节。
二、AOP 解决了什么问题
实际项目中,会经常碰到这种情况:
- 所有接口都要记录请求日志;
- 某些方法执行时间长,需要监控性能;
- 一些接口访问要校验用户权限;
- 所有数据库操作要有事务保护。
如果在每个方法里都手动加这些逻辑,代码会变得重复且难以管理。即使封装了工具方法,也要每次都手动调用,容易遗漏。
AOP 可以统一处理这些逻辑。通过定义规则,让这些逻辑自动“插入”到指定方法的执行前、执行后或抛出异常时。业务代码保持纯净,横切逻辑集中在一个地方维护。
三、AOP 的核心概念
理解 AOP,重点是下面几个概念:
- 切点(Pointcut):定义哪些方法需要被增强。
- 通知(Advice):定义增强逻辑怎么执行,比如执行前、执行后等。
- 切面(Aspect):把切点和通知组合在一起,就是一个切面。
- 织入(Weaving):把增强逻辑应用到目标方法中的过程。
四、Spring AOP 的实现方式
Spring 提供了两种 AOP 实现方式:
1. 基于代理的 AOP(默认)
这是 Spring 默认的方式,依赖代理技术。
- 如果目标类实现了接口,使用 JDK 动态代理;
- 如果没有实现接口,使用 CGLIB 生成子类代理。
Spring 会为目标类生成一个代理类。调用方法时,先走代理,再执行增强逻辑,最后再执行原方法。
2. 基于 AspectJ 的 AOP
这是通过 AspectJ 提供的编译期增强能力完成的。增强代码在编译期就织入到目标类中。性能更好,但配置复杂,调试不方便。
默认开发中,使用的是基于代理的方式。
五、Spring AOP 的执行流程
- 启动时,Spring 扫描所有带有
@Aspect
注解的类; - 提取切点表达式,匹配所有符合条件的方法;
- 为匹配的方法生成代理对象;
- 运行时,方法调用会经过代理逻辑,触发对应的通知方法。
整个过程自动完成,业务代码不需要关心。
六、Spring AOP 的通知类型
Spring 提供了多种通知方式:
@Before
:方法执行前执行;@After
:方法执行后执行(无论是否抛异常);@AfterReturning
:方法成功执行后执行;@AfterThrowing
:方法抛出异常时执行;@Around
:方法执行前后都可以控制,功能最强。
常用的是 @Before
和 @Around
。
比如性能监控可以用 @Around
计算耗时;
权限校验可以用 @Before
拦截非法请求。
七、AOP 的典型应用场景
1. 日志记录
统一记录接口调用、入参、返回值和异常。
避免每个方法手动加日志逻辑。
2. 权限控制
拦截需要权限的方法,在执行前验证用户身份。
不再每个方法里判断用户角色。
3. 性能监控
记录方法执行时间,自动报警慢调用。
统一配置,实时掌握系统瓶颈。
4. 异常处理
统一捕获异常,打印日志,做异常包装或告警。
避免重复 try-catch。
5. 事务控制
配合 @Transactional
注解,自动处理事务开启和提交。
八、使用中的注意点
1. 只对 Spring 容器中的 bean 生效
如果类不是通过 Spring 管理的,AOP 不生效。
直接 new 出来的类,无法织入代理逻辑。
2. 类内部自调用无效
类自己调用自己的方法,不会通过代理。
比如方法 a() 调用方法 b(),b() 即使被增强也不会生效。
解决办法是将 b() 抽取到另一个 bean 中。
3. 性能开销
每次方法调用都要判断切点并执行通知逻辑。
不要滥用,特别是高频方法。
增强逻辑本身也需要精简,避免引入新瓶颈。
4. 调试难度
因为代理类是动态生成的,设置断点不直观。
调试时可打开日志查看代理类信息。
也可以使用 AOP 注解增强类打印堆栈辅助排查。
九、开发建议
- 一个切面只处理一类逻辑,职责单一;
- 注解和切点表达式结合,灵活定义拦截规则;
- 方法上尽量少加多个注解,增强逻辑不宜重叠;
- 配合 Spring Boot,只需加
@EnableAspectJAutoProxy
即可开启; - 日志、监控、权限等统一抽象,避免业务代码干扰。
十、总结
AOP 是一个有用的工具,适合处理项目中那些“重复、统一、通用”的逻辑。用它可以让业务代码更清晰,横切逻辑更集中。
关键是搞清楚它的原理,知道适合做什么,避免滥用。理解代理机制、通知流程和 Spring 的执行细节,是用好 AOP 的基础。
选对场景、合理使用,AOP 能提升项目质量和开发效率。不是所有问题都靠 AOP 解决,合适的时候上,才是它真正的价值。