一. 项目里在调用别人接口时,需要把调用接口的情况入参和出参都进行一下记录,碰到这种情况,我不想在每个调用接口的方法里都写一遍同样的代码,所以就想到用aop来解决这个需求,这篇文章就是讲解下aop的简单使用。
这里先讲下对aop的理解,我们传统的编程方式是垂直化的编程,即A→B→C→D这么下去,一个逻辑完毕之后执行另外一段逻辑。但AOP提供了另外一种思路,它的作用是在业务逻辑不知情(即业务逻辑不需要做任何的改动)的情况下对业务代码的功能进行增强,这种编程思想的使用场景有很多,例如事务提交、方法执行之前的权限检测、日志打印、方法调用事件等等。
1.建好项目后,把pom.xml依赖加进去
2.创建一个controll类和user类
3.创建一个切面类
//申明是个切面 @Aspect//这个注解的作用是:将一个类定义为一个切面类 //申明是个spring管理的bean @Component//这个注解的作用:把切面类加入到IOC容器中 @Order(1) //这个注解的作用是:标记切面类的处理优先级,i值越小,优先级别越高.PS:可以注解类,也能注解到方法上//这个注解的作用是:标记切面类的处理优先级,i值越小,优先级别越高.PS:可以注解类,也能注解到方法上 @Slf4j public class AspectDemo { private Gson gson = new Gson (); //申明一个切点 里面是 execution表达式 @Pointcut("execution(* com.dataw.springboot_aop2..*.*(..))") private void webLog() { } //请求method前打印内容 @Before (value = "webLog()")//这个注解的作用是:在切点前执行方法,内容为指定的切点 public void methodBefore(JoinPoint joinPoint){ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); //打印请求内容 log.info("========================请求内容======================"); log.info("请求地址:" + request.getRequestURI().toString()); log.info("请求方式" + request.getMethod()); log.info("请求类方法" + joinPoint.getSignature()); log.info("请求类方法参数" + Arrays.toString(joinPoint.getArgs())); log.info("========================请求内容======================"); } //在方法执行完结后打印返回内容 @AfterReturning(returning = "o", pointcut = "webLog()" ) //这个注解的作用是:在切入点,return后执行,如果想对某些方法的返回参数进行处理,可以在这操作 public void methodAfterReturing(Object o) { log.info("--------------返回内容----------------"); log.info("Response内容:" + gson.toJson(o)); log.info("--------------返回内容----------------"); }
}
使用@AfterReturning注解可指定如下两个常用属性。
1) pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。
2) returning:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。除此之外,在Advice方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值
4.通过启动类启动项目访问即可http://localhost:8083/test/testAspect?name=www