目 录CONTENT

文章目录

如何在 Spring Boot 中创建自定义注解简化重复编码

在等晚風吹
2024-12-30 / 0 评论 / 0 点赞 / 13 阅读 / 0 字 / 正在检测是否收录...

如何在 Spring Boot 中创建自定义注解简化重复编码

在开发过程中,你是否曾因重复编写相同代码而感到困扰?如果你正在使用 Spring Boot,想必已经体验到注解的强大功能。然而,当现有的注解无法完全满足你的需求时,该如何解决呢?

这就是自定义注解的用武之地!通过创建自己的注解,可以封装重复的代码模式,让代码更加简洁和易于维护。本文将探讨如何在 Spring Boot 中创建自定义注解,以帮助简化开发过程并避免冗余代码。

场景介绍

举个例子:假如需要将应用程序中的所有错误记录到错误日志表中。若每次都在方法中手动添加日志代码,不仅重复,还容易出错。通过创建自定义注解,可以让这些操作自动化,从而避免重复编写相同的代码。

本文将带你完成以下步骤:

  1. 添加 Spring AOP 依赖项。
  2. 创建自定义注解。
  3. 定义切面处理逻辑。
  4. 在项目中应用自定义注解。

第一步:添加 Spring AOP 依赖项

在项目的 pom.xml 文件中添加以下依赖项:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>6.1.12</version>
</dependency>

第二步:创建自定义注解

定义一个用于标记错误处理方法的注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ErrorHandler {
}

注解解析

  • @Retention(RetentionPolicy.RUNTIME):确保注解在运行时可用。
  • @Target(ElementType.METHOD):指定注解只能用于方法。

接下来,我们为该注解定义切面逻辑。

第三步:定义切面逻辑

创建一个切面类,用于处理带有 @ErrorHandler 注解的方法中的异常:

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.UUID;

@Aspect
@Component
public class ErrorHandlerAspect {
    private final ErrorLogRepository errorLogRepository;

    public ErrorHandlerAspect(ErrorLogRepository errorLogRepository) {
        this.errorLogRepository = errorLogRepository;
    }

    @Pointcut("@annotation(ErrorHandler)")
    public void handleException() {}

    @AfterThrowing(pointcut = "handleException()", throwing = "ex")
    public void afterThrowing(Exception ex) {
        System.out.println("Exception occurred: " + ex.getMessage());

        ErrorLog errorLog = new ErrorLog();
        errorLog.setErrorLogId(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE);
        errorLog.setExceptionMessage(ex.getMessage());
        errorLog.setExceptionStackTrace(getStackTraceAsString(ex));

        errorLogRepository.save(errorLog);
    }

    private String getStackTraceAsString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
}

切面解析

  • @Aspect:标记该类为切面。
  • @Pointcut:定义一个切入点,匹配所有带有 @ErrorHandler 注解的方法。
  • @AfterThrowing:当方法抛出异常时执行通知逻辑。
  • afterThrowing 方法:捕获异常信息并将其记录到日志表中。

第四步:使用自定义注解

在需要自动记录异常的地方添加 @ErrorHandler 注解:

@ErrorHandler
public void testExceptionLogging() {
    // 模拟异常
    throw new RuntimeException("Exception occurred");
}

效果

testExceptionLogging 方法抛出异常时,切面会捕获异常,并将详细信息记录到日志表中。

总结

通过创建自定义注解(如 @ErrorHandler),你可以简化代码中的重复任务,提高可维护性。借助 Spring AOP,能够集中管理错误处理逻辑,避免业务逻辑中充斥大量的 try-catch 块。

这种方法不仅减少了样板代码,还确保了错误处理和日志记录的一致性。通过自定义注解,你可以更专注于应用程序的核心功能,而让自动化机制处理像错误日志记录这样的横切关注点。

那么,你是否有自定义过注解?它们是用来解决什么问题的呢?欢迎在留言区分享你的经验!

0

评论区