揭秘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项目中优雅地解决各种实际问题。这种方式不仅使代码更加简洁和可维护,还提高了开发效率和代码质量。希望以上的三个实例能够帮助你更好地理解和应用自定义注解。

相关文章
|
9天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
27 0
|
27天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
16天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
15天前
|
缓存 监控 Java
|
15天前
|
缓存 监控 Java
|
17天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
58 2
|
17天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
12天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
24天前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
43 0
|
24天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。