SpringAOP实现日志收集管理功能(步骤详解)

 更新时间:2022年03月31日 15:20:59   作者:张泓锐  
这篇文章主要介绍了SpringAOP实现日志收集管理功能,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

第一步引入必要的依赖

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.15</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>

第二步创建自定义日志注解类

package com.example.aop.log.annotion;
import java.lang.annotation.*;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:56
 */
@Inherited
@Target({ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface LogNotice {}

第三步切面设计,扫描上面的注解

package com.example.aop.log.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:59
 */
@Aspect
@Component
public class LogAspect {
  @Pointcut("@annotation(com.example.aop.log.annotion.LogNotice)")
  public void doLog() {}
  @Around("doLog()")
  public Object insertLog(ProceedingJoinPoint joinPoint) throws Throwable {
    Object object = joinPoint.proceed();
    try {
      HashMap paramsMap;
      Signature signature = joinPoint.getSignature();
      Method method = ((MethodSignature) signature).getMethod();
      String methodName = method.getName();
      String className = method.getDeclaringClass().getName();
      paramsMap = (HashMap) getParams(joinPoint, method);
      // 打印日志,可以记录到数据库的日志表里面,等到有客户反馈的时候好去查询日志
      System.out.println(
          "methodName: " + methodName + "; className: " + className + "; paramsMap:" + paramsMap);
      // 也可以记录请求当前接口耗费的时间
    } catch (Exception e) {
      // 如果在日志记录的过程中出现问题,那么要处理一下异常,不要直接抛出,此处做成消息队列通知或者打印日志
    }
    // 此处要进行返回代理的对象,如果没有返回的话,前端是收不到数据的
    return object;
  }
  private Map<String, Object> getParams(ProceedingJoinPoint joinPoint, Method method) {
    // get parameter names
    String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method);
    Object[] args = joinPoint.getArgs();
    Map<String, Object> params = new HashMap<>(8);
    if (parameterNames != null && parameterNames.length != 0) {
      for (int i = 0; i < parameterNames.length; i++) {
        params.put(parameterNames[i], args[i]);
      }
    return params;
}

第四步把自定义的注解放到你的接口上面

package com.example.demo.controller;
import com.example.aop.log.annotion.LogNotice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:50
 */
@RestController
@RequestMapping("/person")
public class PersonController {
  //在此处加上你自定义的注解(@LogNotice)
  @LogNotice
  @GetMapping("get_person")
  public String getPerson(Integer numbers) {
    return "123";
  }
}

第五步测试

到此这篇关于SpringAOP实现日志收集管理功能的文章就介绍到这了,更多相关SpringAOP日志收集管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JPA @Query时,无法使用limit函数的问题及解决

    JPA @Query时,无法使用limit函数的问题及解决

    这篇文章主要介绍了JPA @Query时,无法使用limit函数的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot测试junit遇到的坑及解决

    SpringBoot测试junit遇到的坑及解决

    这篇文章主要介绍了SpringBoot测试junit遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 简单了解java ibatis #及$的区别和用法

    简单了解java ibatis #及$的区别和用法

    这篇文章主要介绍了简单了解java ibatis #及$的区别和用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java集合使用 Iterator 删除元素

    Java集合使用 Iterator 删除元素

    这篇文章主要介绍了Java集合使用 Iterator 删除元素,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring boot详解缓存redis实现定时过期方法

    Spring boot详解缓存redis实现定时过期方法

    本篇文章分享的就是spring boot中的一个轮子,spring cache注解的方式实现接口数据缓存。默认的配置想非常简单,但是有一个弊端是缓存数据为永久缓存,本次将介绍如何设置接口缓存数据的过期时间
    2022-07-07
  • Eclipse转Itellij IDEA导入Git/svn本地项目的详细步骤

    Eclipse转Itellij IDEA导入Git/svn本地项目的详细步骤

    这篇文章主要介绍了Eclipse转Itellij IDEA导入Git/svn本地项目,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • mybatis-plus开启sql打印的三种方式总结

    mybatis-plus开启sql打印的三种方式总结

    这篇文章主要给大家介绍了mybatisplus开启sql打印的三种方式,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Maven中jar包下载失败的几种解决方法

    Maven中jar包下载失败的几种解决方法

    本文主要介绍了Maven中jar包下载失败的几种解决方法,包括配置国内Maven源、删除本地jar包目录重新下载,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Spring 依赖注入实现示例

    Spring 依赖注入实现示例

    这篇文章主要介绍了Spring 依赖注入实现示例的相关资料,帮助大家更好的理解和使用spring框架,感兴趣的朋友可以了解下
    2020-11-11
  • Java信号量全解析

    Java信号量全解析

    这篇文章主要介绍了Java信号量的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01

最新评论