切面AOP的实现
1、包引入
在默认的包中没有,需要单独集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>3.3.2</version><!-- 版本根据自己的springboot选择,这里使用的版本为3.3.2-->
</dependency>
springboot默认有的starter,对应的版本在spring-boot-dependencies-3.3.2.pom中定义默认依赖版本
2、切面定义流程
2.1 切面定义流程
1、在类上使用@Aspect 声明该类为一个切面类,同时注意使用@Component将切面注入到容器中
2、在切面类方法使用@Pointcut注解声明一个切点方法,该方法为一个空的方法体,该方法不执行任何具体业务逻辑,主要用于标记或作为切入点表达式的依据。
切点表达式常用为两种 execution() 和 @annotation,
execution(modifier? ret-type declaring-type?name-pattern(param-pattern) throws-pattern?)
所有表达式方法
- arg () 限制连接点的指定参数为指定类型的执行方法
- @args () 限制连接点匹配参数由指定注解标注的执行方法
- execution () 用于匹配连接点的执行方法
- this () 限制连接点匹配 AOP 代理的 Bean 引用为指定类型的类
- target () 限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型注解
- within() 限制连接点匹配指定类型
- @within() 限制连接点匹配指定注释所标注的类型
- @annotation 限制匹配带有指定注释的连接点
3、在切面类中通过注解声明切面的通知方法(也就是不同执行时机的回调方法) Spring 切面可应用的 5 种通知类型:
- @Before——在方法调用之前调用通知
- @After——在方法完成之后调用通知,无论方法执行成功与否
- @After-returning——在方法执行成功之后调用通知
- @After-throwing——在方法抛出异常后进行通知
- @Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
在定义通知方法的时候,一般可以使用 JoinPoint 作为参数,环绕通知使用 ProceedingJoinPoint。
完整代码
切面类
package org.javatrip.springbootaop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.