我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring boot配置绑定和配置属性校验的方式详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring boot配置绑定和配置属性校验的方式详解

配置绑定

所谓配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
SpringBoot 提供了以下 2 种方式进行配置绑定:

  • 使用 @ConfigurationProperties 注解
  • 使用 @Value 注解

先建立数据配置文件

application.yml

sb:
  port: 8086
  username: 'abc \n hello' #字符串 
  password: 6564321 #字符串 
  birthday: 2011/12/23 #日期 
  books: #map 
    jsp: 36 
    html: 78 
    spring: 78 
  books2: {jsp: 56,spring: 65,mybatis: 98} #map 行内 
  person: #javabean 
    name: abc 
    age: 23 
  person2: {name: lily, age: 36 } #javabean行内 
  hobby: #数组 
    - jsp 
    - hibernate 
    - spring 
    - mybatis 
  list: # list集合 
    - 32 
    - 65
    - 98 
  set: #set 集合 
    - hello 
    - world 
  hobby2: [23,45,56] #数组 list set 行内 
  mapList: # 数组 list set 里存map 
    - jsp: 36 
      hibernate: 58 
    - html: 65 
      css: 98 
      js: 65
    - {vue: 36,react: 98}

@ConfigurationProperties

通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。
DbConfig.java

@Configuration 
@ConfigurationProperties(prefix = "sb") 
public class DbConfig { 
String username; 
String password; 
Date birthday;
Map books;
Person person;
Map books2;
Person person2;
String [] hobby;
List list;
Set set ;
int [] hobby2;
List<Map> mapList;
        
       }

只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如
果我们想要使用 @ConfigurationProperties 注解进行配置绑定,
那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用
到 @Configuration 注解来添加组件到容器中。
JavaBean 上使用了注解 @ConfigurationProperties(prefix = “sb”)
,它表示将这个 JavaBean 中的所有属性与配置文件中以“sb”为前
缀的配置进行绑定。

@Value

@Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。 @Value的值有两类:
① ${property : default_value }
② #{ obj.property? :default_value }
第一个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。
default_value,就是前面的值为空时的默认值。注意二者的不同,#{}里面那个obj代表对象。

也就是说@Value注解有两种用法,一种是@Value(“${}”)和@Value(“#{}”),搞清楚分类后我们一一来分析。

第一种 @Value(“${}”)

controller层代码:

@RestController
@RequestMapping("/test")
public class ValueController {
    @Autowired
    private CarpollingService carpollingService;
    @GetMapping("/getValue")
    public String getValue(){
        return carpollingService.getValue();
    }
}

配置类代码:

@Configuration 
public class CarpollingServiceImpl {
    @Value("${db.port}")
    private String port;
    @Override
    public String getValue() {
        return port;
    }
}

第二种@Value(“#{}”)

注意: #{}是不能以第一种方式来进行取值,否则会报错

前面已经说了,#{}里面包含的是obj,所以需要配合bean来使用,现在创建一个UserBean,并且给某个字段加上@Value(“#{}”)注解(按自己的需求任意添加注解)

UserBean类代码:

@Data
@Component//添加component注解,使其注册进容器,交由容器进行管理
public class UserBean {
    private String name="张三";}

controller层代码:

@RestController
@RequestMapping("/test")
public class ValueController {
       @Autowired
    CarpollingServiceImpl carpollingService;
    @GetMapping("/getValue")
    public String getValue(){
        return carpollingService.getValue();
    }
}

配置类代码:

@Configuration
public class CarpollingServiceImpl {
    @Value("#{userBean.name}")
    private String port;
    public String getValue() {
        return port;
    }
}

@PropertySource

如果将所有的配置都集中到 application.properties 或 application.yml
中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

我们也可以自定义配置文件,例如新建 db.properties ,配置内容如下:

pro.username=admin 
pro.password=123456 
pro.birthday=2000/12/01 
pro.age=23 
pro.books={jsp:36,html:360,spring:65} 
pro.hobby=23,34 
pro.list=sprig,myatis 

配置类:

@Component 
@PropertySource("classpath:db.properties") 
@Data 
public class User {
 @Value("${pro.username}") 
 String username; 
 @Value("${pro.password}") 
 String password; 
 @Value("${pro.birthday}") 
 Date birthday;
 }

注: 该注解只能引用properties文件

配置属性校验

自定义配置文件时,可以使用@Validated注解对注入的值进行一些简单的校验,示例代码:
Testconfig.java

@Validated
@Configuration
@ConfigurationProperties(prefix = "sb")
public class Testconfig {
    @Max(value = 123)
    private String password;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

测试

 @Autowired
    Testconfig testconfig;
    @Test
    void a() {
        System.out.println(testconfig.getPassword());
    }

抛出错误,最大值不能超过123

@Max(value = 123)注解会对注入的值进行校验,如果不是小于123的将会报错抛出
其它常见注解:
@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,
是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验

上述的这些注解位于javax.validation.constraints包下, SpringBoot 2.3.0以后maven引用:

<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-validation</artifactId> 
</dependency>

@Value 与 @ConfigurationProperties对比

@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。

1. 使用位置不同

  • @ConfigurationProperties:标注在 JavaBean 的类名上;
  • @Value:标注在 JavaBean 的属性上。

2. 功能不同

  • @ConfigurationProperties:用于批量绑定配置文件中的配置;
  • @Value:只能一个一个的指定需要绑定的配置。

3. 松散绑定支持不同

@ConfigurationProperties:支持松散绑定(松散语法),例如实体类Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:

  • person.firstName
  • person.first-name
  • person.first_name
  • PERSON_FIRST_NAME

@Vaule:不支持松散绑定。

4. SpEL 支持不同

  • @ConfigurationProperties:不支持 SpEL 表达式;
  • @Value:支持 SpEL 表达式。

5. 复杂类型封装

  • @ConfigurationProperties:支持所有类型数据的封装,例如 Map、 List、Set、以及对象等;
  • @Value:支持基本数据类型的封装,例如字符串、布尔值、整数等类型, 对集合Map list set配置有要求

6.属性校验

  • @Value不支持属性校验
  • @ConfigurationProperties 支持属性校验

7. 应用场景不同

@Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。

  • 若只是获取配置文件中的某项值,则推荐使用 @Value 注解;
  • 若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。

我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果

到此这篇关于Spring boot配置绑定和配置属性校验的文章就介绍到这了,更多相关Spring boot配置属性校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring boot配置绑定和配置属性校验的方式详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解Spring-boot中读取config配置文件的两种方式

了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息。Spring-Boot读取配置文件的方式:一.读取核心配置文件信息ap
2023-05-31

Spring Task定时任务的配置和使用详解

记录下Spring自带的定时任务用法。spring中使用定时任务基于xml配置文件使用定时任务首先配置spring开启定时任务2023-05-31

Spring注解@Value及属性加载配置文件方式的示例分析

这篇文章主要介绍了Spring注解@Value及属性加载配置文件方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring中使用@Value注解给bean加载属
2023-06-20

Spring中利用配置文件和@value注入属性值代码详解

1 简单属性值注入package com.xy.test1;import org.springframework.beans.factory.annotation.Value;import org.springframework.stere
2023-05-30

Spring Boot全局配置和注解的操作方法有哪些

这篇文章主要讲解了“Spring Boot全局配置和注解的操作方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot全局配置和注解的操作方法有哪些”吧!目录零、学习目
2023-06-20

Spring将一个的类配置成Bean的方式详解

这篇文章主要介绍了Spring将一个的类配置成Bean的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-03-20

Spring事务Transaction配置的五种注入方式详解

前段时间对spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。总结如下:Spring配置文件中关于事务
2023-05-31

Spring Boot读取配置文件内容的3种方式(@Value、Environment和@ConfigurationProperties)

工作中经常会有一些参数需要配置,同时在代码里面需要用到,所有就需要配置类读取,然后在使用的时候注入该类进行获取相关参数,下面这篇文章主要给大家介绍了关于Spring Boot读取配置文件内容的3种方式,需要的朋友可以参考下
2023-01-04

一文详解spring注解配置bean的初始化方法和销毁方法

本篇我们讲解下spring项目中如何为bean指定初始化方法和销毁方法。当spring完成bean的属性赋值之后,就会执行bean的初始化方法,而当spring要销毁bean实例的时候,也会调用bean的销毁方法。文中有详细的代码实例,需要的朋友可以参考下
2023-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录