• Springboot-aop的使用


    aop:面向切面编程,可以看作是面向对象的补充
    举例
    在这里插入图片描述

    1.依赖

        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.1version>
            <relativePath/> 
        parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
            dependency>
            
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-aopartifactId>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.28version>
        dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.使用

    1.自定义注解

    /**
     * @author wyr
     * @version 1.0
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SysLog {
        /**
         * 描述
         *
         * @return {String}
         */
        String value() default "";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.切面类

    @Slf4j
    @Aspect
    @Component
    public class SysLogAspect {
        //定义切点 值为注解的全路径 拦截所有使用了拦截SysLog注解的方法
        @Pointcut("@annotation(com.example.demo.annotation.SysLog)")
        public void sysLogAspect() {
    
        }
        @Around(value="sysLogAspect()") //直接value="@annotation(com.example.demo.annotation.SysLog)"也可以
        public Object around(ProceedingJoinPoint point){
            Object proceed = null;
            try {
                //使用注解的方法执行之前 相等于 @before
                //获取类名
                String className = point.getTarget().getClass().getName();
                //获取执行的方法名
                String methodName = point.getSignature().getName();
                //获取参数
                Object[] args = point.getArgs();
                //获取方法上注解的值
                MethodSignature methodSignature = (MethodSignature)point.getSignature();
                String annotationVal= methodSignature.getMethod().getAnnotation(SysLog.class).value();
    
                log.info("[类名]:{},[方法]:{},[参数]:{},[操作]:{}", className, methodName, JSON.toJSONString(args),annotationVal);
                //相等于放行 如果直接return 则不执行使用了该注解对应的方法
                System.out.println("方法执行之前");
                proceed = point.proceed();
                System.out.println("方法执行之后");
                //使用注解的方法之后
                System.out.println("方法的返回值是:"+proceed);
    
            } catch (Throwable e) {
                throw  new RuntimeException(e.getMessage());
            }
            return proceed;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    3.使用

    @RestController
    public class UserController {
        @GetMapping("/test/{name}")
        @SysLog("操作是获取名称")
        public String test(@PathVariable("name") String name){
            System.out.println("方法开始执行");
            return "我是返回值";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    51单片机1【单片机到底是什么】
    GZIP文件压缩原理以及实现
    XXE-Lab for PHP
    Domino服务器SSL证书安装指南
    [Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]
    【JavaEE重点知识归纳】第8节:面向对象程序三大特性:封装、继承、多态
    第二十一章 构建和配置 Nginx (UNIX® Linux macOS) - 为CSP构建Nginx的过程
    关于我的项目-微信公众号~
    微服务开发平台 Spring Cloud Blade 部署实践
    Python学习小组课程P1-Python基础(1)语法与数组
  • 原文地址:https://blog.csdn.net/wyr1235/article/details/134424552