springboot AOP

aop详细介绍自行搜索引擎,本文仅介绍使用

  1. 引入依赖

    org.springframework.boot
    spring-boot-starter-aop

  1. execution表达式
  • 创建测试controller
@GetMapping("getInfo")
public String getInfo(String name, Integer age){
    return name + ":" + age;
}
  • 创建请求参数打印Aspect
@Aspect
@Component
//lombok日志
@Slf4j
public class LogAspect {

    //execution表达式自行搜索引擎
    @Pointcut("execution(* demo.springboot.aop.ctrl.*.*(..))")
    public void pointcut() {}

    @Before("pointcut()")
    public void printParam(JoinPoint joinPoint){
        //获取请求的方法
        Signature sig = joinPoint.getSignature();
        String method = joinPoint.getTarget().getClass().getName() + "." + sig.getName();

        //获取请求的参数
        Object[] args = joinPoint.getArgs();
        //fastjson转换
        String params = JSONObject.toJSONString(args);

        //打印请求参数
        log.info(method + ":" + params);
    }
}
  • 测试
    浏览器访问http://localhost:8080/getInfo?name=hello&age=18
    控制台日志:
    2019-05-11 21:28:23.526 INFO 44940 --- [nio-8080-exec-9] demo.springboot.aop.aspect.LogAspect : demo.springboot.aop.ctrl.TestController.getInfo:["hello",18]
  1. 对特定注解的方法进行aop操作
  • 创建注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Print {
    String value() default "";
}
  • 创建测试controller
//使用注解
@Print(value = "printParamAndResult")
@GetMapping("getString")
public String getString(String src){
    return src;
}
  • 创建打印请求参数、返回结果的Aspect
@Aspect
@Component
//lombok日志
@Slf4j
public class LogAspect {

    @Pointcut("@annotation(print)")
    public void annotationPointcut(Print print){}

    @Around("annotationPointcut(print)")
    public Object around(ProceedingJoinPoint pjp, Print print) throws Throwable {
        //获取请求方法
        Signature sig = pjp.getSignature();
        String method = pjp.getTarget().getClass().getName() + "." + sig.getName();

        //获取请求的参数
        Object[] args = pjp.getArgs();
        //fastjson转换
        String params = JSONObject.toJSONString(args);

        //打印请求参数
        log.info("参数:" + method + ":" + params);

        //执行方法
        Object result = pjp.proceed();

        //打印返回结果
        log.info("返回结果:" + method + ":" + result);
        return result;
    }
}
  • 测试
    浏览器访问http://localhost:8080/getString?src=hello
    控制台日志:
    2019-05-11 21:36:28.291 INFO 44940 --- [nio-8080-exec-3] demo.springboot.aop.aspect.LogAspect : 参数:demo.springboot.aop.ctrl.TestController.getString:["hello"]
    2019-05-11 21:36:28.291 INFO 44940 --- [nio-8080-exec-3] demo.springboot.aop.aspect.LogAspect : 返回结果:demo.springboot.aop.ctrl.TestController.getString:hello

项目路径


作者博客

作者公众号


你可能感兴趣的:(springboot AOP)