美文网首页
springboot_aop

springboot_aop

作者: 一个老程序员 | 来源:发表于2021-11-22 08:54 被阅读0次

    springboot_aop

    1、引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    2、创建注解

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Print {
        String value() default "";
    }
    

    3、创建切面aspect

    @Aspect
    @Component
    //lombok日志
    @Slf4j
    public class LogPrint {
    
    //切点 print是自定义注解
        @Pointcut("@annotation(print)")
        public void pointcut(Print print){}
    
        @Around("pointcut(print)")//pointcut即切点方法
        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);
            System.out.println("参数:" + method + ":" + params);
            //执行方法
            Object result = pjp.proceed();
    
            //打印返回结果
            log.info("返回结果:" + method + ":" + result);
            System.out.println("返回结果:" + method + ":" + result);
            return result;
        }
    
    }
    
    

    4、测试

    创建controller 将注解@Print写在方法上

    @RestController
    public class AspectController {
    
        @GetMapping("get")
        @Print(value = "hello")
        public String get(String name,int age){
            return "ok";
        }
    
    }
    
    

    5、execution

    有时候我们不想在每个方法上都加注解,想让某个包下面的类的方法都执行aop,可以用execution,
    只需将切点方法上改为下面代码

        @Pointcut("execution(* com.epay..*.*(..))")
        public void pointCut(){}
        
        
    
    符号 含义
    执行() 表达式的主体;
    第一个” *“符号 表示返回值的类型任意;
    com.sample.service.impl AOP所切的服务的包名,即,我们的业务部分
    包名后面的” ..“ 表示当前包及子包
    第二个” *“ 表示类名,*即所有类。此处可以自定义,下文有举例
    。*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型

    相关文章

      网友评论

          本文标题:springboot_aop

          本文链接:https://www.haomeiwen.com/subject/zhvptrtx.html