Spring AOP 的原理和常见应用
AOP 是 Spring 的核心功能之一,但真正用起来容易踩坑。很多人知道 @Aspect 注解,却不清楚代理模式的区别、切面的执行顺序、以及自调用失效的问题。本文从配置到常见问题,把实际项目中的处理思路整理出来。
先搭一个最小接口
以 Spring Boot 为例,一个接口最好保持分层清楚:
|
Controller 只负责接收请求和返回结果,业务逻辑放到 Service。这样代码更容易测试,也更容易维护。
配置和验证
如果涉及环境配置,建议拆分:
spring: |
生产环境启动时不要手工改文件,可以通过参数指定:
java -jar app.jar --spring.profiles.active=prod |
接口写完后,用 curl 验证:
curl http://localhost:8080/users/1 |
常见坑
- 事务方法必须通过 Spring 代理调用,类内部直接调用可能导致事务不生效。
- Controller 不要返回 Entity,避免数据库字段直接暴露。
- 参数校验和异常处理最好统一做,不要散落在每个接口里。
核心要点
JDK 动态代理和 CGLIB 代理的区别:前者基于接口,后者基于类
切面的优先级由 @Order 注解控制,数字越小优先级越高
自调用问题的原因是内部方法调用不会经过代理对象
使用 ProxyUtils 或暴露 AopContext 可以解决自调用问题
总结
AOP 是实现横切关注点的利器,但需要理解其底层机制才能用好。在实际项目中,日志、事务、权限校验都是 AOP 的典型应用场景。