Spring Boot自定义注解

文章目录

  • [Spring Boot自定义注解](#Spring Boot自定义注解)
    • [步骤 1: 定义注解](#步骤 1: 定义注解)
    • [步骤 2: 创建注解处理器](#步骤 2: 创建注解处理器)
    • [步骤 3: 使用注解](#步骤 3: 使用注解)

Spring Boot自定义注解

在Spring Boot中自定义注解是一个强大的功能,它可以让你以声明式的方式将特定的行为或元数据添加到你的代码中。自定义注解可以用于多种场景,比如权限控制、日志记录、参数校验等。下面是如何在Spring Boot中定义一个简单的自定义注解及其使用的步骤。

步骤 1: 定义注解

首先,你需要使用Java的元注解(如@Target, @Retention, @Inherited等)来定义一个新的注解。这些元注解指定了你的注解可以应用到哪些Java元素上(如类、方法、字段等),以及注解的生命周期(如只在源码中存在,还是会被编译到字节码中,或者是被JVM运行时可见)。

java 复制代码
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Target({ElementType.METHOD}) // 注解可以应用于方法上  
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时有效  
public @interface LogExecutionTime {  
    // 可以在这里定义注解的属性  
    String description() default "No description";  
}

步骤 2: 创建注解处理器

接下来,你需要创建一个注解处理器,通常是通过使用Spring的AOP(面向切面编程)功能来实现。你可以通过定义一个切面(Aspect)来拦截带有你的自定义注解的方法,并在这些方法执行前后执行特定的逻辑。

java 复制代码
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.aspectj.lang.annotation.Pointcut;  
import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.After;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.stereotype.Component;  
  
@Aspect  
@Component  
public class LogAspect {  
  
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);  
  
    // 定义一个切点,用于匹配所有带有@LogExecutionTime注解的方法  
    @Pointcut("@annotation(logExecutionTime)")  
    public void logPointcut(LogExecutionTime logExecutionTime) {}  
  
    // 环绕通知,用于计算方法的执行时间  
    @Around("logPointcut(logExecutionTime)")  
    public Object logExecutionTime(ProceedingJoinPoint joinPoint, LogExecutionTime logExecutionTime) throws Throwable {  
        long start = System.currentTimeMillis();  
        Object proceed = joinPoint.proceed(); // 继续执行目标方法  
        long executionTime = System.currentTimeMillis() - start;  
  
        logger.info("{} executed in {} ms. Description: {}",   
            joinPoint.getSignature().toShortString(),   
            executionTime,   
            logExecutionTime.description());  
  
        return proceed;  
    }  
}

步骤 3: 使用注解

现在,你可以在你的Spring Boot应用的任何地方使用@LogExecutionTime注解了,只需将其添加到任何方法上,并可选地提供一个描述。

java 复制代码
@RestController  
@RequestMapping("/api")  
public class MyController {  
  
    @LogExecutionTime(description = "This is a test method")  
    @GetMapping("/test")  
    public ResponseEntity<String> testMethod() {  
        // 模拟一些操作  
        try {  
            Thread.sleep(1000); // 假设这个方法需要一些时间来完成  
        } catch (InterruptedException e) {  
            Thread.currentThread().interrupt();  
        }  
        return ResponseEntity.ok("Test method executed");  
    }  
}

当testMethod被调用时,LogAspect会拦截这个调用,并在方法执行前后执行特定的逻辑(在这个例子中,是记录方法的执行时间)。

通过上述步骤,你可以在Spring Boot应用中定义和使用自定义注解来增强你的代码功能和可读性。

相关推荐
Tigshop开源商城20 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
养肥胖虎20 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
REDcker20 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
晓杰'20 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o21 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl21 小时前
Multi-Head Attention:为什么要分多个头
后端
kobesdu21 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx231 天前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy1 天前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
江离w1 天前
新版vibecoding项目初始化指令
java