• SpringAop之日志(读配置文件方式)


    读配置文件的目的在于减少代码上的冗余,这个冗余通常指加注解之类的。

    比方说,我们原来的代码是这样:

    @GetMapping("/list")
    @Log(title = "查询用户列表", businessType = BusinessType.QUERY)
    public AjaxResult list() {
    
        return AjaxResult.success(userService.queryUserListInfo());
    }

    相当于每个我都要加上@Log,我才能在aop中将其插入日志表(识别功能),现在我觉得这样太麻烦了。所以我可以这样做,也就是将@Log抽取一个配置文件,这个配置文件,团队定个规矩,上线前统一更改即可。

    于是我的AOP代码就变成这样:

    @Aspect
    @Component
    public class LogAspect {
    
    
        public static LogAspect logAspect;
    
        @PostConstruct
        public void init() {
            logAspect = this;
        }
    
        @Pointcut("execution(public * com.eqics.blog.controller..*.*(..))")
        public void Pointcut() {
    
            System.out.println("切点");
        }
    
    
        //@Around:环绕通知
        @Around("Pointcut()")
        @Transactional(isolation = Isolation.DEFAULT)
        public Object Around(ProceedingJoinPoint pjp) throws Throwable {
            Map<String, Object> data = new HashMap<>();
            //获取目标类名称
            String clazzName = pjp.getTarget().getClass().getName();
            //获取目标类方法名称
            String methodName = pjp.getSignature().getName();
    
            // 请求的地址
            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
    
            String apiUrl = ServletUtils.getRequest().getRequestURI();
    
             //关键核心代码
            InputStream path = getClass().getResourceAsStream("/api.properties");
            BufferedReader reader = new BufferedReader(new InputStreamReader(path));
            System.out.println("reader:" + reader);
    
    
            Properties pro = new Properties();
            pro.load(reader);
    
            System.out.println("pro:" + pro.getProperty(apiUrl));
    
            data.put("apiUrl", apiUrl);
    
            //IP地址
            data.put("ip", ip);
    
            //记录类名称
            data.put("clazzName", clazzName);
            //记录对应方法名称
            data.put("methodName", methodName);
            //记录请求参数
            data.put("params", pjp.getArgs());
    
            //开始调用时间
            // 计时并调用目标函数
            long start = System.currentTimeMillis();
            Object result = pjp.proceed();
            Long time = System.currentTimeMillis() - start;
    
            //记录返回参数
            data.put("result", result);
    
            //设置消耗总时间
            data.put("consumeTime", time);
    
            try {
    
                System.out.println("日志输出:" + data);
    
            } catch (Exception e) {
            
                e.printStackTrace();
            }
    
            return result;
    
        }
    
    
    }

    api.properties配置文件如下:

    # 用户管理
    /blog_user/list=get user manage
    /blog_user/list_test=用户管理测试
  • 相关阅读:
    洛谷P2158 [SDOI2008]仪仗队 欧拉函数的应用
    leetcode 130. 被围绕的区域 DFS
    TediousLee CodeForces
    AccurateLee双指针+贪心+字符串
    leetcode80. 删除排序数组中的重复项 II
    CHFDORA:哆啦 A 梦
    cdq分治浅谈
    leetcode面试题64. 求1+2+…+n
    leetcode84. 柱状图中最大的矩形
    leetcode874. 模拟行走机器人
  • 原文地址:https://www.cnblogs.com/youcong/p/13548743.html
Copyright © 2020-2023  润新知