揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效

简介: 揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效

在Spring Boot项目中,自定义注解可以大大简化代码并提高可读性和可维护性。本文将通过三个具体场景展示如何优雅地使用自定义注解来解决实际问题。

场景一:统一的日志记录

在实际开发中,我们经常需要在方法执行前后记录日志。通过自定义注解和AOP,可以优雅地实现这一功能。

1. 创建自定义注解:

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

2. 实现AOP切面:

@Aspect
@Component
public class LogAspect {
 
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
 
    @Around("@annotation(com.example.LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
 
        Object proceed = joinPoint.proceed();
 
        long executionTime = System.currentTimeMillis() - start;
 
        logger.info("{} executed in {} ms", joinPoint.getSignature(), executionTime);
 
        return proceed;
    }
}

3. 使用自定义注解:

@RestController
public class UserController {
 
    @LogExecutionTime
    @GetMapping("/users")
    public List<User> getAllUsers() {
        // 获取用户列表的逻辑
        return userService.findAll();
    }
}
场景二:参数校验

在Spring Boot中,可以使用自定义注解来简化参数校验逻辑。

1. 创建自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = PhoneValidator.class)
public @interface ValidPhone {
    String message() default "Invalid phone number";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2. 实现校验逻辑:

public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
 
    private static final String PHONE_PATTERN = "^\\+?[0-9. ()-]{7,25}$";
 
    @Override
    public void initialize(ValidPhone constraintAnnotation) {
    }
 
    @Override
    public boolean isValid(String phoneField, ConstraintValidatorContext context) {
        return phoneField != null && phoneField.matches(PHONE_PATTERN);
    }
}

3. 使用自定义注解:

public class UserDTO {
 
    @ValidPhone
    private String phoneNumber;
 
    // 其他字段和getter、setter
}

4. 控制器中使用参数校验:

@RestController
public class UserController {
 
    @PostMapping("/users")
    public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO, BindingResult result) {
        if (result.hasErrors()) {
            return ResponseEntity.badRequest().body(result.getAllErrors().toString());
        }
        // 创建用户的逻辑
        return ResponseEntity.ok("User created successfully");
    }
}
场景三:权限控制

通过自定义注解,可以简化权限控制的逻辑。

1. 创建自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiresPermission {
    String value();
}

2. 实现AOP切面:

@Aspect
@Component
public class PermissionAspect {
 
    @Autowired
    private PermissionService permissionService;
 
    @Around("@annotation(requiresPermission)")
    public Object checkPermission(ProceedingJoinPoint joinPoint, RequiresPermission requiresPermission) throws Throwable {
        String permission = requiresPermission.value();
        if (!permissionService.hasPermission(permission)) {
            throw new AccessDeniedException("Access denied");
        }
        return joinPoint.proceed();
    }
}

3. 使用自定义注解:

@RestController
public class UserController {
 
    @RequiresPermission("admin")
    @GetMapping("/admin")
    public ResponseEntity<String> getAdminPage() {
        return ResponseEntity.ok("Welcome to admin page");
    }
}

总结

通过自定义注解,结合Spring AOP和Validator,我们可以在Spring Boot项目中优雅地解决各种实际问题。这种方式不仅使代码更加简洁和可维护,还提高了开发效率和代码质量。希望以上的三个实例能够帮助你更好地理解和应用自定义注解。

相关文章
|
2月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
236 3
|
2月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
467 128
|
1月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
1260 32
|
1月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
323 2
|
2月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
277 12
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
491 5
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
167 0
探索Spring Boot的@Conditional注解的上下文配置
|
存储 缓存 前端开发
spring中这些能升华代码的技巧,可能会让你爱不释手(下)
spring中这些能升华代码的技巧,可能会让你爱不释手
spring中这些能升华代码的技巧,可能会让你爱不释手(下)
|
XML Java 数据库连接
spring中这些能升华代码的技巧,可能会让你爱不释手(上)
spring中这些能升华代码的技巧,可能会让你爱不释手
spring中这些能升华代码的技巧,可能会让你爱不释手(上)