• 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
  • 相关阅读:
    Flutter 开关和切换高级指南
    苹果Mac电脑fcpx视频剪辑:Final Cut Pro中文最新 for mac
    南京大学【软件分析】13 Static Analysis for Security
    阿里云Intel Xeon Platinum可扩展处理器性能说明
    掌握雅思写作:任务 2(在 7 小时内达到 7+ 级)
    【正点原子i.MX93开发板试用连载体验】简单的音频分类
    Apache IoTDB 0.13.0 权限控制不当漏洞
    3.SpringSecurity基于数据库的认证与授权
    Arial.tff字体,YOLO中下载。已解决
    Seata 1.5.2 源码学习(Client端)
  • 原文地址:https://blog.csdn.net/wyr1235/article/details/134424552