一、主要设计注解: @Aspect @After @before @Pointcut @Around
pom文件引入
<!--用于aop切面编程-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
二、AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
execution后面参数的定义
eg.
任意公共方法的执行:execution(public * *(..))
任何一个以“set”开始的方法的执行:execution(* set*(..))
AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service..*.*(..))
第一个*表示匹配任意的方法返回值execution(* , ..(两个点)表示零个或多个参数,第一个..表示service包及其子包,第二个*表示所有类, 第三个*表示所有方法,第二个..表示方法的任意参数个数
注解实现:
1、引入注解
2、顶一个切面类LogAspect ,要对下面Controller下面所有类进行切面
@Aspect
@Order(1)//指定切面的优先级
@Component
@EnableAspectJAutoProxy //使aspect起作用 自动匹配代理对象
public class LogAspect {
@Pointcut("execution(* com.example.springbootproject.Controller.*.*(..))")//定义在Controller包里所有类,所有的方法的任意方法的执行
public void apilog() {
}
@Before("apilog()")
public void doBefore() {
System.out.printf("Before方法执行");
}
@After("apilog()")
public void doAfter() {
System.out.printf("after方法执行");
}
@Around("apilog()") //这里必须有返回对象,否则切面接口 void就会出现无返回
public Object logArround(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
System.out.println("环绕前入参:"+JSON.toJSONString(args[0]));
System.out.println(joinPoint.getSignature());
Object proceed = joinPoint.proceed();
System.out.println("出参:"+JSON.toJSONString(proceed));
System.out.println("环绕后");
return proceed;
}
}
执行结果: