前言:
使用spring框架很久,AOP听的也很多了,从来没有实际接触过,碰巧这次项目中用到了。
此次项目中我碰到的业务情况是:需要在系统一些阶段添加token验证的功能,如果用普通的方式为每个方法配置拦截器,就会变得非常繁琐,我们可以将需要进行token验证的所有方法看成一个切面,通过配置切点来完成操作。
引入pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
写一个简单的controller
@RequestMapping("/aopTest")
@ResponseBody
public String aopTest() {
return "aoptest";
}
aspect类
package com.cognizant.xd.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
/**
* Created by KANADE_XD on 7/10/2020 10:42 AM
*/
@Aspect //声明这是个切面
@Configuration
public class AspectTest {
@Pointcut(value = "execution(* com.cognizant.xd.controller.*.* (..))")//切点路径
public void pointcut() {
}
//前置通知(进入环绕后执行,下一步执行方法)
@Before(value="pointcut()")
public void doAccessCheck(JoinPoint joinPoint){
System.out.println("@Before前置通知:"+ Arrays.toString(joinPoint.getArgs()));
}
//环绕通知
@Around(value = "pointcut()")
public Object doaround(ProceedingJoinPoint point)throws Throwable{
System.out.println("***enter Around***");
Object object=point.proceed();
System.out.println(point.getThis()+"***end Around***");
return object;
}
//异常通知(出错时执行)
@AfterThrowing(value="pointcut()",throwing="ex")
public void doAfterThrow(JoinPoint joinPoint,Throwable ex){
System.out.println("@AfterThrowing例外通知(异常通知)"+Arrays.toString(joinPoint.getArgs()));
System.out.println("@AfterThrowing异常信息:"+ex);
}
//后置通知(返回之前执行)
**加粗样式**@After(value="pointcut()")
public void after(){
System.out.println("@After后置通知...");
}
//最终通知(正常返回通知,最后执行)
@AfterReturning(value="pointcut()")
public void doAfter(){
System.out.println("@AfterReturning最终通知...End!");
}
}
测试结果
***enter Around***
@Before前置通知:[]
com.cognizant.xd.controller.TestController2@52af9ad8***end Around***
@After后置通知...
@AfterReturning最终通知...End!
不难看出上述内容的执行顺序