SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值

简介: SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值

在进行Web开发时,对于一些接口,我们需要对参数进行效验来保证接口的正确性。同时,对于参数中某些项缺失的情况,我们需要给这些缺失的参数设置默认值。这时候,SpringBoot的自定义注解和AOP技术就派上用场了。

本文将介绍如何使用SpringBoot的自定义注解和AOP技术,实现参数效验和默认值赋值的功能。首先,我们将介绍一下SpringBoot自定义注解和AOP的相关知识,然后,我们再详细介绍如何使用这两个工具来完成参数效验和默认值赋值。

SpringBoot自定义注解

在SpringBoot中,我们可以通过自定义注解来对类、方法和参数等进行标记。SpringBoot提供了一个@interface关键字,用于定义一个注解接口,其中可以定义多个属性,用于接收注解参数。下面是一个示例代码:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
   
    String value() default "";
}

在上面的代码中,我们定义了一个名为MyAnnotation的注解,它有一个属性value,用于接收注解参数。这个注解是用于参数效验和默认值赋值的。

AOP技术

在SpringBoot中,我们可以通过AOP(面向切面编程)技术来实现对方法的拦截和处理。AOP就是在不修改原有业务逻辑的情况下,通过对一些横切关注点的抽象和封装,实现对业务逻辑的增强或者干预。

在SpringBoot中,我们可以使用@Aspect注解来定义一个切面,用于进行方法的拦截和处理。AOP技术的实现需要依赖于SpringBoot的自定义注解。下面是一个示例代码:

@Aspect
@Component
public class MyAspect {
   
    @Around("execution(* com.example.demo.controller.*.*(..)) && @annotation(annotation)")
    public Object doAround(ProceedingJoinPoint pjp, MyAnnotation annotation) throws Throwable {
   
        // TODO: 在这里进行参数效验和默认值赋值的操作
        return pjp.proceed();
    }
}

在上面的代码中,我们定义了一个名为MyAspect的切面,它使用了@Around注解,表示它会拦截所有在com.example.demo.controller包下的方法,并且这些方法需要被MyAnnotation注解标记。在方法拦截后,我们可以在doAround()方法中对参数进行效验和默认值赋值的操作。

参数效验

在进行Web开发时,我们经常需要对参数进行效验,以确保数据的正确性。我们可以通过自定义注解和AOP技术来实现这个功能。

首先,定义一个用于效验的注解:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyNotNull {
   
    String value() default "参数不能为空";
}

在上面的代码中,我们定义了一个MyNotNull注解,它有一个属性value,用于接收注解参数。这个注解是用于参数非空效验的。

下面是一个具体的效验实现:

@Aspect
@Component
public class MyAspect {
   
    @Around("execution(* com.example.demo.controller.*.*(..)) && @annotation(notNull)")
    public Object doAround(ProceedingJoinPoint pjp, MyNotNull notNull) throws Throwable {
   
        // 获取方法参数
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
   
            if (arg == null || arg.toString().trim().equals("")) {
   
                throw new IllegalArgumentException(notNull.value());
            }
        }
        return pjp.proceed();
    }
}

在上面的代码中,我们使用了@Around注解和MyNotNull注解,表示我们需要拦截所有被MyNotNull注解标记的方法,并进行参数的非空效验。在doAround()方法中,我们首先获取方法的参数列表,然后遍历每个参数,如果该参数为null或者为空字符串,则抛出一个IllegalArgumentException异常。

默认值赋值

在进行Web开发时,我们经常需要对参数进行默认值的赋值,以确保参数的完整性。我们可以通过自定义注解和AOP技术来实现这个功能。

首先,定义一个用于默认值赋值的注解:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyDefault {
   
    String value() default "";
}

在上面的代码中,我们定义了一个MyDefault注解,它有一个属性value,用于接收注解参数。这个注解是用于参数默认值赋值的。

下面是一个具体的默认值赋值实现:

@Aspect
@Component
public class MyAspect {
   
    @Around("execution(* com.example.demo.controller.*.*(..)) && @annotation(myDefault)")
    public Object doAround(ProceedingJoinPoint pjp, MyDefault myDefault) throws Throwable {
   
        // 获取方法参数
        Object[] args = pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
   
            if (args[i] == null) {
   
                // 设置默认值
                args[i] = myDefault.value();
            }
        }
        return pjp.proceed(args);
    }
}

在上面的代码中,我们使用了@Around注解和MyDefault注解,表示我们需要拦截所有被MyDefault注解标记的方法,并进行参数的默认值赋值。在doAround()方法中,我们首先获取方法的参数列表,然后遍历每个参数,如果该参数为null,则将其设置为MyDefault注解的属性值。

总结

本文介绍了如何使用SpringBoot自定义注解和AOP技术来实现参数效验和默认值赋值的功能。通过自定义注解和AOP技术,我们可以方便地对参数进行效验和默认值赋值,提高了代码的可读性和可维护性。这种方法可以用于各种Web开发场景中,对于一些需要对参数进行效验和默认值赋值的接口特别有用。

目录
相关文章
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
152 0
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
162 2
|
1月前
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
57 1
|
1月前
|
XML Java 数据格式
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
本文介绍了如何使用Spring框架的注解方式实现AOP(面向切面编程)。当目标对象没有实现接口时,Spring会自动采用CGLIB库进行动态代理。文中详细解释了常用的AOP注解,如`@Aspect`、`@Pointcut`、`@Before`等,并提供了完整的示例代码,包括业务逻辑类`User`、配置类`SpringConfiguration`、切面类`LoggingAspect`以及测试类`TestAnnotationConfig`。通过这些示例,展示了如何在方法执行前后添加日志记录等切面逻辑。
88 2
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
|
16天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
58 2
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
120 0
|
1月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
61 1