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开发场景中,对于一些需要对参数进行效验和默认值赋值的接口特别有用。

目录
相关文章
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
414 0
|
11月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
527 6
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
503 1
|
9月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1031 0
|
9月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
510 0
|
11月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
768 8
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
838 5
|
XML Java 数据格式
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
本文介绍了如何使用Spring框架的注解方式实现AOP(面向切面编程)。当目标对象没有实现接口时,Spring会自动采用CGLIB库进行动态代理。文中详细解释了常用的AOP注解,如`@Aspect`、`@Pointcut`、`@Before`等,并提供了完整的示例代码,包括业务逻辑类`User`、配置类`SpringConfiguration`、切面类`LoggingAspect`以及测试类`TestAnnotationConfig`。通过这些示例,展示了如何在方法执行前后添加日志记录等切面逻辑。
1322 2
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
281 1
|
JSON 前端开发 Java
SpringBoot 如何进行参数校验
在SprinBoot中如何集成参数校验Validator,以及参数校验的高阶技巧
289 1
SpringBoot 如何进行参数校验