Spring AOP 深度解析
Spring AOP(面向切面编程)是Spring框架的核心模块之一,它通过代理机制实现了横切关注点(cross-cutting concerns)的模块化,使开发者能够将与业务逻辑无关的功能(如日志、事务、安全等)从业务代码中分离出来。
核心概念
1. 切面(Aspect)
- 定义:封装横切关注点的模块,包含通知和切点
- 实现方式:使用
@Aspect
注解标注的类 - 示例:日志记录、性能监控、事务管理等
2. 连接点(Join Point)
- 定义:程序执行过程中的特定点(如方法调用、异常抛出等)
- Spring AOP仅支持方法级别的连接点(不同于AspectJ)
3. 通知(Advice)
- 类型:
- @Before:方法执行前执行
- @AfterReturning:方法正常返回后执行
- @AfterThrowing:方法抛出异常后执行
- @After:方法结束后执行(无论正常或异常)
- @Around:包围方法执行(最强大的通知类型)
4. 切点(Pointcut)
- 定义:匹配连接点的表达式,决定哪些方法会被拦截
- 表达式语法:主要使用AspectJ切点表达式语言
execution()
:最常用的切点指示器@annotation()
:匹配带有特定注解的方法
实现原理
Spring AOP通过动态代理实现,具体有两种方式:
-
JDK动态代理(默认)
- 要求目标类必须实现接口
- 运行时生成接口的代理类
-
CGLIB代理
- 针对没有实现接口的类
- 通过继承目标类生成子类代理
- 需要添加CGLIB库依赖
典型应用场景
- 声明式事务管理(
@Transactional
) - 安全控制(权限检查)</