Spring Boot常用注解@ConfigurationProperties、松散绑定、数据校验

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Boot常用注解@ConfigurationProperties、松散绑定、数据校验

@ConfigurationProperties

源码分析

@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,通过如下源码可以看出, 如果你想绑定和验证一些外部属性,可以将它添加到类定义或@Configuration类中的@Bean方法上。


image.png


标注在类上

@Data   //使用该注解需要导入Lombok依赖
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {
    private String userId;
    private String name;
}

application.yml文件配置内容

userInfo:
  userId: 1001
  name: lucy

接下来通过控制器方法来返回这个对象,查看数据是否绑定

@RestController
public class HelloController {
    @Autowired
    private UserInfo userInfo;
    @GetMapping("/user")
    public UserInfo getUserInfo(){
        return userInfo;
    }
}

image.png


标注在方法上

上面源码中说到可以将它添加到@Configuration类中的@Bean方法上,所以下面来看看标注在方法上是如何使用的!


比如我们用到druid数据源的操作,这个数据源是属于第三方的,所以我们不能操作源码,不能再源码里面找到它的对象来给他添加注解,但我们可以在yml文件中给他配置,来拿到它的属性。


首先添加所需的依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.11</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

接着在yml文件中配置数据源

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
      username: root
      password: root

创建一个配置类,然后在类方法上添加注解,并通过prefix绑定数据

@SpringBootConfiguration
public class DatasourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.database.druid")
    public DataSource database(){
        return new DruidDataSource();
    }
}

通过控制器方法来检验绑定效果

@RestController
public class HelloController {
    @Autowired
    private DataSource dataSource;
    @GetMapping("/datasource")
    public void getDataSource(){
        System.out.println(dataSource);
    }
}

访问http://localhost/datasource,查看控制台输出!!!


image.png


松散绑定

我们在使用 @ConfigurationProperties注解的时候,@ConfigurationProperties(prefix = “userinfo”),这里给prefix的属性值与yml文件中的属性名称不一致,但是依旧绑定成功了!原因是什么呢?这就需要提到Spring的松散绑定属性规则。因此使用以下方式书写都能与类的属性名称匹配。

userInfo:
  userId: 1001 # 驼峰命名方式
  #user_id: 1002 #下划线方式
  #user-id: 1003 #烤肉串方式
  #USER_ID: 1004 # 常量方式
  name: lucycd

需要注意的是,prefix的属性值必须全部为小写,就像下图所示,就会报错:前缀必须是规范形式。


image.png


运行程序,也会在控制台提示你:配置属性名称“userInfo”无效;无效字符:“I”


image.png


数据校验

Spring Boot中有很多配置文件,配置文件中我们可以自定义一些对应的属性值。那么这些属性值是否合法呢?我们如何来校验?在Java中有一种JSR303规范,我们可以针对一些对应的数值来进行校验。按照规范来进行书写,如果不符合要求就说明校验失败,反之,则成功!


SpringBoot也给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVA EE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。


导入验证包和校验实现包

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

添加注解@Validated

给属性添加验证规则

@Data
@Component
@ConfigurationProperties(prefix = "userinfo")
@Validated
public class UserInfo {
   @Max(value = 1000,message = "userid超出范围了!")
   @Min(value = 0,message = "userid不能小于0!")
   private String userId;
   @Size(min = 2,max = 5,message = "name长度应该在2-5之间")
   private String name;
}

这里我们先输入不符合规范的数据,来验证数据是否能够校验成功

userInfo:
  userId: 1001
  name: lucycd

编写一个控制器方法来检验

@RestController
public class HelloController {
    @Autowired
    private UserInfo userInfo;
    @GetMapping("/user")
    public UserInfo getUserInfo(){
        return userInfo;
    }
}

运行程序,查看控制台,校验成功!!!

image.png


同样,将数据修改为符合规则的数据,程序就可以成功运行了!!!

当然,这里的校验规则还有许多,@NotNull、@NotEmpty、@Email等等,可以根据实际情况选择合适的注解。

image.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
28 0
|
16天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
7天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
18 2
|
18天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
13天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
6月前
|
Java 数据安全/隐私保护
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
321 1
|
2月前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
43 2
|
3月前
|
缓存 Java Spring
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决