Java外功精要——Spring AOP
Java外功精要——Spring AOP
Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它能够帮助开发者将横切关注点(如日志、事务、安全等)与业务逻辑分离,提高代码的模块化程度和可维护性。
AOP核心概念
- 切面(Aspect): 横切关注点的模块化,如日志切面、事务切面
- 连接点(Join Point): 程序执行过程中的某个特定点,如方法调用、字段访问
- 通知(Advice): 切面在特定连接点执行的动作,分为前置、后置、环绕、异常、最终通知
- 切入点(Pointcut): 匹配连接点的断言,决定哪些连接点会被通知
- 引入(Introduction): 向现有类添加新方法或字段
- 目标对象(Target Object): 被一个或多个切面通知的对象
- AOP代理(AOP Proxy): Spring创建的代理对象,用于实现切面契约
- 织入(Weaving): 将切面应用到目标对象并创建代理对象的过程
Spring AOP通知类型
- @Before: 目标方法执行前执行
- @AfterReturning: 目标方法正常返回后执行
- @AfterThrowing: 目标方法抛出异常后执行
- @After: 目标方法执行后无论结果如何都执行(类似于finally)
- @Around: 围绕目标方法执行,可控制方法执行时机
实现示例
下面是一个使用Spring AOP实现日志记录的示例:
切入点表达式详解
Spring AOP使用AspectJ的切入点表达式语言,基本格式:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
execution(修饰符? 返回值 包名.类名.?方法名(参数) 异常?)常用通配符:
-
*: 匹配任意字符,但只能匹配一个元素 -
..: 匹配任意字符,可以匹配多个元素,在类路径中表示当前包及其子包,在方法参数中表示任意参数 -
+: 匹配指定类及其子类
示例:
-
execution(* com.example.service.*.*(..)): 匹配service包下所有类的所有方法 -
execution(public * *(..)): 匹配所有公共方法 -
execution(* com.example.service.UserService+.*(..)): 匹配UserService及其子类的所有方法
Spring AOP的实现原理
Spring AOP默认使用动态代理实现:
- 当目标对象实现了接口时,使用JDK动态代理
- 当目标对象没有实现接口时,使用CGLIB代理
