美文网首页
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

    springboot_aop 1、引入依赖 2、创建注解 3、创建切面aspect 4、测试 创建controll...

网友评论

      本文标题:springboot_aop

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