springboot项目——自定义注解实现方法级别的日志管理(附源码地址)

6 篇文章 0 订阅
1 篇文章 0 订阅

测试结果截图

在这里插入图片描述以上结果展示了通过注解获取Controller请求地址,方法参数,方法返回结果,方法名,方法类路径,参数名称,参数内容,以及注解相关信息

创建注解类@Log

BusinessType:拓展类,可以自主添加或者保留想要的信息

public enum BusinessType {
    OTHER,

    INSERT,

    UPDATE,

    DELETE,

    IMPORT,

    EXPORT,
}

Log

@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    // 标题
    String title() default "";

    // 设置一个业务类型(新增,删除...)
    BusinessType businessType() default BusinessType.OTHER;

    // 是否保存请求参数
    boolean isSaveRequestData() default true;


}

创建切面类LogAspect

LogAspect

@Aspect
@Component
public class LogAspect {

    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);

    @Autowired
    private SecurityUtil securityUtil;

    /***
     * 配置织入点
     */
    @Pointcut("@annotation(com.example.bootactiviti7.aspect.log.Log)")
    public void logPointCut() {
    }

    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
        handle(joinPoint, null, jsonResult);
    }

    @AfterThrowing(pointcut = "logPointCut()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
        handle(joinPoint, e, null);
    }

    private void handle(JoinPoint joinPoint, Exception e, Object jsonResult) {
        Log annotationLog = getAnnotationLog(joinPoint);
        if (Objects.isNull(annotationLog)) {
            return;
        }
        // 获取当前登录用户
        //securityUtil.logInAs("system");
        //Long userId = 100L;
        // TODO:这里就是看需要将你想要的日志存储起来的地方,就是组装好你的日志类,然后insert进数据库,每个人的实现方法不一样,也很简单,就不赘述了,如有需要帮助,请留言讨论
        // 返回信息或者异常信息
        log.info("jsonResult====== " + JSON.toJSONString(jsonResult));
        if (Objects.nonNull(e)) {
            log.info("Exception ====== " + e.getMessage());
        }
        // 请求方法
        log.info("methodName ====== " + joinPoint.getSignature().getName());
        log.info("className ====== " + joinPoint.getTarget().getClass().getName());
        // 请求参数
        log.info("parameter ====== " + Arrays.toString(joinPoint.getArgs()));
        log.info("joinPoint ====== " + Arrays.toString(((MethodSignature) joinPoint.getSignature()).getParameterNames()));

        // 打印注解上的东西
        log.info("title ====== " + annotationLog.title());
        log.info("businessType().ordinal ====== " + annotationLog.businessType().ordinal());
        log.info("annotationLog.isSaveRequestData ====== " + annotationLog.isSaveRequestData());

        // 打印请求地址
        log.info("Request URL ===== " + ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest().getRequestURI());
    }

    /***
     判断方法是否存在Log注解,并且返回Log包含的信息
     */
    public Log getAnnotationLog(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method != null) {
            return method.getAnnotation(Log.class);
        }
        return null;
    }

}

创建测试LogController

@RestController
public class LogController {

    @GetMapping("/testLog")
    @Log(title = "测试删除日志", businessType = BusinessType.DELETE)
    public String testLogTag(String name, Integer age){
        return "测试删除日志返回结果";
    }
}

之后启动项目,访问你的项目地址localhost:xxxx/testLog?name=aaa&age=18然后看你的日志消息,就可以看见第一张图的结果啦!

git地址:本项目是Springboot和activit7的集成项目(并不复杂,只是在测试类进行了一些测试),同时还包括了一些设计模式的demo,如有需要,请自取哈!项目经过测试,且本人有时间就会在上面进行实践,欢迎交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤实现一个基本的自定义注解: 1. 创建一个自定义注解类,使用 @interface 关键字声明该类为注解类。 ```java @Target(ElementType.METHOD) // 定义注解作用的目标类型,这里是方法 @Retention(RetentionPolicy.RUNTIME) // 定义注解的生命周期,这里是运行时 public @interface MyAnnotation { String value() default ""; // 定义一个成员变量,用于存储注解的属性值 } ``` 2. 在需要使用注解方法上添加注解,并设置属性值。 ```java @MyAnnotation(value = "hello world") public void myMethod() { // do something } ``` 3. 创建一个切面类,使用 @Aspect 注解声明该类为切面类,并编写切面方法,在切面方法中获取注解的属性值并进行处理。 ```java @Aspect @Component public class MyAnnotationAspect { @Before("@annotation(myAnnotation)") public void beforeMethod(JoinPoint joinPoint, MyAnnotation myAnnotation) { String value = myAnnotation.value(); // do something with value } } ``` 4. 在 Spring Boot 启动类上添加 @EnableAspectJAutoProxy 注解启用切面功能。 ```java @SpringBootApplication @EnableAspectJAutoProxy public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 这样就完成了一个简单的自定义注解实现。在实际应用中,我们可以根据需要添加更多的属性和切面逻辑,实现更加灵活和功能强大的自定义注解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值