首页 > 其他分享 >SpringBoot篇(配置文件)

SpringBoot篇(配置文件)

时间:2024-10-21 21:21:17浏览次数:3  
标签:SpringBoot 配置文件 绑定 bean 校验 ConfigurationProperties 注解 属性

目录

一、@ConfigurationProperties

1. 简介

2. 实现步骤

3. 具体如何使用呢?

4. 感觉这没区别啊?

5. 知识小结

二、宽松绑定/松散绑定

1. 前言

2. 什么是宽松绑定?

3. 为什么这样呢?

4. 知识小结

三、常用计量单位绑定

1. 前言

2. 这个时候问题就来了,怎么解决这个误会?

四、校验

1. 前言

2. 实现步骤

3. 知识小结

五、数据类型转换

1. 前言

2. 知识小结

六、代码位置


一、@ConfigurationProperties

1. 简介

@ConfigurationProperties注解,此注解的作用是用来为bean绑定属性的。

开发者可以在yml配置文件中以对象的格式添加若干属性

servers:
  ip-address: 192.168.0.1 
  port: 2345
  timeout: -1

然后再开发一个用来封装数据的实体类,注意要提供属性对应的setter方法

@Component
@Data
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

使用@ConfigurationProperties注解就可以将配置中的属性值关联到开发的模型类上

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

这样加载对应bean的时候就可以直接加载配置属性值了。

但是目前我们学的都是给自定义的bean使用这种形式加载属性值,如果是第三方的bean呢?

能不能用这种形式加载属性值呢?为什么会提出这个疑问?

原因就在于当前@ConfigurationProperties注解是写在类定义的上方,而第三方开发的bean源代码不是你自己书

写的,你也不可能到源代码中去添加@ConfigurationProperties注解,这种问题该怎么解决呢?

下面就来说说这个问题。

使用@ConfigurationProperties注解其实可以为第三方bean加载属性,格式特殊一点而已。

2. 实现步骤

步骤一:使用@Bean注解定义第三方bean

@Bean
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

步骤二:在yml中定义要绑定的属性,注意datasource此时全小写

datasource:
  driverClassName: com.mysql.jdbc.Driver

步骤三:使用@ConfigurationProperties注解为第三方bean进行属性绑定,注意前缀是全小写的datasource

@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

操作方式完全一样,只不过@ConfigurationProperties注解不仅能添加到类上,还可以添加到方法上,添加到类

上是为spring容器管理的当前类的对象绑定属性,添加到方法上是为spring容器管理的当前方法的返回值对象绑

定属性,其实本质上都一样。

做到这其实就出现了一个新的问题,目前我们定义bean不是通过类注解定义就是通过@Bean定义,使用

@ConfigurationProperties注解可以为bean进行属性绑定,那在一个业务系统中,哪些bean通过注解

@ConfigurationProperties去绑定属性了呢?

因为这个注解不仅可以写在类上,还可以写在方法上,所以找起来就比较麻烦了。

为了解决这个问题,spring给我们提供了一个全新的注解,专门标注使用@ConfigurationProperties注解绑定属

性的bean是哪些。

这个注解叫做@EnableConfigurationProperties。

3. 具体如何使用呢?

步骤一:在配置类上开启@EnableConfigurationProperties注解,并标注要使用@ConfigurationProperties注

解绑定属性的类

@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class Springboot13ConfigurationApplication {
}

步骤二:在对应的类上直接使用@ConfigurationProperties进行属性绑定

@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

4. 感觉这没区别啊?

注意观察,现在绑定属性的ServerConfig类并没有声明@Component注解。

当使用@EnableConfigurationProperties注解时,spring会默认将其标注的类定义为bean,因此无需再次声明

@Component注解了。

最后再说一个小技巧,使用@ConfigurationProperties注解时,会出现一个提示信息

出现这个提示后只需要添加一个坐标此提醒就消失了

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-configuration-processor</artifactId>

</dependency>

5. 知识小结

  1. 使用@ConfigurationProperties可以为使用@Bean声明的第三方bean绑定属性
  2. 当使用@EnableConfigurationProperties声明进行属性绑定的bean后,无需使用@Component注解再次进行bean声明

二、宽松绑定/松散绑定

1. 前言

在进行属性绑定时,可能会遇到如下情况,为了进行标准命名,开发者会将属性名严格按照驼峰命名法书写,在

yml配置文件中将datasource修改为dataSource,如下:

dataSource:
  driverClassName: com.mysql.jdbc.Driver

此时程序可以正常运行,然后又将代码中的前缀datasource修改为dataSource,如下:

@Bean
@ConfigurationProperties(prefix = "dataSource")
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

此时就发生了编译错误,而且并不是idea工具导致的,运行后依然会出现问题,配置属性名dataSource是无效的

Configuration property name 'dataSource' is not valid:

    Invalid characters: 'S'
    Bean: datasource
    Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter

Action:
Modify 'dataSource' so that it conforms to the canonical names requirements.

为什么会出现这种问题,这就要来说一说SpringBoot进行属性绑定时的一个重要知识点,

有关属性名称的宽松绑定,也可以称为宽松绑定。

2. 什么是宽松绑定?

实际上是springboot进行编程时人性化设计的一种体现,

即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。

兼容到什么程度呢?几乎主流的命名格式都支持,例如:

在ServerConfig中的ipAddress属性名

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
}

可以与下面的配置属性名规则全兼容

servers:
  ipAddress: 192.168.0.2       # 驼峰模式
  ip_address: 192.168.0.2      # 下划线模式
  ip-address: 192.168.0.2      # 烤肉串模式
  IP_ADDRESS: 192.168.0.2      # 常量模式

也可以说,以上4种模式最终都可以匹配到ipAddress这个属性名。

3. 为什么这样呢?

原因就是在进行匹配时,配置中的名称要去掉中划线和下划线后,忽略大小写的情况下去与java代码中的属性名进

行忽略大小写的等值匹配,以上4种命名去掉下划线中划线忽略大小写后都是一个词ipaddress,java代码中的属

性名忽略大小写后也是ipaddress,这样就可以进行等值匹配了,这就是为什么这4种格式都能匹配成功的原因。

不过springboot官方推荐使用烤肉串模式,也就是中划线模式。

到这里我们掌握了一个知识点,就是命名的规范问题。再来看开始出现的编程错误信息

Configuration property name 'dataSource' is not valid:

    Invalid characters: 'S'
    Bean: datasource
    Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter

Action:
Modify 'dataSource' so that it conforms to the canonical names requirements.

其中Reason描述了报错的原因,规范的名称应该是烤肉串(kebab)模式(case),即使用-分隔,使用小写字母数字

作为标准字符,且必须以字母开头。然后再看我们写的名称dataSource,就不满足上述要求。闹了半天,在书写

前缀时,这个词不是随意支持的,必须使用上述标准。编程写了这么久,基本上编程习惯都养成了,到这里又被

springboot教育了,没辙,谁让人家东西好用呢,按照人家的要求写吧。

最后说一句,以上规则仅针对springboot中@ConfigurationProperties注解进行属性绑定时有效,对@Value注

解进行属性映射无效。

有人就说,那我不用你不就行了?

不用,你小看springboot的推广能力了,到原理篇我们看源码时,你会发现内部全是这玩意儿,算了,拿人手短

吃人嘴短,认怂吧。

4. 知识小结

  1. @ConfigurationProperties绑定属性时支持属性名宽松绑定,这个宽松体现在属性名的命名规则上
  2. @Value注解不支持松散绑定规则
  3. 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符

三、常用计量单位绑定

1. 前言

在前面的配置中,我们书写了如下配置值,其中第三项超时时间timeout描述了服务器操作超时时间,当前值是-1

表示永不超时。

servers:
  ip-address: 192.168.0.1 
  port: 2345
  timeout: -1

但是每个人都这个值的理解会产生不同,比如线上服务器完成一次主从备份,配置超时时间240,这个240如果单

位是秒就是超时时间4分钟,如果单位是分钟就是超时时间4小时。

面对一次线上服务器的主从备份,设置4分钟,简直是开玩笑,别说拷贝过程,备份之前的压缩过程4分钟也搞不

定,

2. 这个时候问题就来了,怎么解决这个误会?

除了加强约定之外,springboot充分利用了JDK8中提供的全新的用来表示计量单位的新数据类型,从根本上解决

这个问题。以下模型类中添加了两个JDK8中新增的类,分别是Duration和DataSize

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;
}

Duration:表示时间间隔,可以通过@DurationUnit注解描述时间单位,例如上例中描述的单位为小时

(ChronoUnit.HOURS)

DataSize:表示存储空间,可以通过@DataSizeUnit注解描述存储空间单位,例如上例中描述的单位为MB

(DataUnit.MEGABYTES)

使用上述两个单位就可以有效避免因沟通不同步或文档不健全导致的信息不对称问题,从根本上解决了问题,避

免产生误读。

Druation常用单位如下:

DataSize常用单位如下:

四、校验

1. 前言

目前我们在进行属性绑定时可以通过松散绑定规则在书写时放飞自我了,但是在书写时由于无法感知模型类中的

数据类型,就会出现类型不匹配的问题,比如代码中需要int类型,配置中给了非法的数值,例如写一个“a",这

种数据肯定无法有效的绑定,还会引发错误。

SpringBoot给出了强大的数据校验功能,可以有效的避免此类问题的发生。

在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使

用Hibernate提供的校验框架来作为实现进行数据校验。书写应用格式非常固定,话不多说,直接上步骤。

2. 实现步骤

步骤一:开启校验框架

<!--1.导入JSR303规范-->
<dependency>
    <groupId>javax.validation</groupId>

    <artifactId>validation-api</artifactId>

</dependency>

<!--使用hibernate框架提供的校验器做实现-->
<dependency>
    <groupId>org.hibernate.validator</groupId>

    <artifactId>hibernate-validator</artifactId>

</dependency>

步骤二:在需要开启校验功能的类上使用注解@Validated开启校验功能

@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
}

步骤三:对具体的字段设置校验规则

@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
    //设置具体的规则
    @Max(value = 8888,message = "最大值不能超过8888")
    @Min(value = 202,message = "最小值不能低于202")
    private int port;
}

通过设置数据格式校验,就可以有效避免非法数据加载,其实使用起来还是挺轻松的,基本上就是一个格式。

3. 知识小结

  1. 开启Bean属性校验功能一共3步:
  2. 导入JSR303与Hibernate校验框架坐标
  3. 使用@Validated注解启用校验功能
  4. 使用具体校验规则规范数据校验格式

五、数据类型转换

1. 前言

在个人使用过程中,其实我们遇到的问题往往复杂度比较低,单一性比较强,但是到了线上开发时,都是综合性

的问题,而这个开发者遇到的问题就是由于bean的属性注入引发的灾难。

先把问题描述一下,这位开发者连接数据库正常操作,但是运行程序后显示的信息是密码错误。

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

其实看到这个报错,几乎所有的学习者都能分辨出来,这是用户名和密码不匹配,就就是密码输入错了,但是问

题就在于密码并没有输入错误,这就比较讨厌了。给的报错信息无法帮助你有效的分析问题,甚至会给你带到沟

里。如果是初学者,估计这会心态就崩了,我密码没错啊,你怎么能说我有错误呢?来看看用户名密码的配置是

如何写的:

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

这名开发者的生日是1月27日,所以密码就使用了0127,其实问题就出在这里了。

在整数相关知识中有这么一句话,支持二进制,八进制,十六进制

这个问题就处在这里了,因为0127在开发者眼中是一个字符串“0127”,但是在springboot看来,这就是一个数

字,而且是一个八进制的数字。当后台使用String类型接收数据时,如果配置文件中配置了一个整数值,他是先安

装整数进行处理,读取后再转换成字符串。

巧了,0127撞上了八进制的格式,所以最终以十进制数字87的结果存在了。这里提两个注意点,第一,字符串标

准书写加上引号包裹,养成习惯,第二,遇到0开头的数据多注意吧。

2. 知识小结

  1. yaml文件中对于数字的定义支持进制书写格式,如需使用字符串请使用引号明确标注

六、代码位置

标签:SpringBoot,配置文件,绑定,bean,校验,ConfigurationProperties,注解,属性
From: https://blog.csdn.net/qq_51226710/article/details/143133840

相关文章

  • SpringBoot篇(一、认识SpringBoot)
    目录一、SpringBoot存在的意义二、为什么要用SpringBoot三、SpringBoot的优点四、Spring&SpringBoot&SpringCloud的关系五、SpringBoot简化操作的体现1.创建独立的Spring应用程序2.嵌入式servlet容器3.提供starter简化Maven配置4.自动配置Spring5......
  • 基于SpringBoot+Vue+Uniapp微信小程序的文化宣传系统设计与实现(源码+文档+部署)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • 基于SpringBoot+Vue+Uniapp微信小程序的学生寝室管理系统设计与实现(源码+文档+部署)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Swagge详解,SpringBoot项目集成Swagger
    介绍        相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接......
  • springboot接口Get请求实体类入参
    在springboot中,对HTTPGET请求,通常不会将请求体(body)作为主要的数据传输方式,因为GET请求通常用于请求数据,而不是发送数据到服务器(尽管从技术上讲,GET请求可以包含请求体,但这并不常见,也不符合RESTfulAPI的设计原则)。因此,对于GET请求的入参,通常不会使用@RequestBody注解。一、......
  • 基于SpringBoot的银行信用卡额度管理系统
    具体实现截图系统测试从多个角度进行测试找到系统中存在的问题是本系统首要的测试目的,通过功能测试寻找出系统缺陷并改正,确保系统没有缺陷。在测试过程中证明系统满足客户需求,发现问题和不足及时改正。测试完成之后得出测试结论。系统测试目的在酒店管理系统......
  • 基于SpringBoot 的社团管理系统视频
    具体实现截图系统测试从多个角度进行测试找到系统中存在的问题是本系统首要的测试目的,通过功能测试寻找出系统缺陷并改正,确保系统没有缺陷。在测试过程中证明系统满足客户需求,发现问题和不足及时改正。测试完成之后得出测试结论。系统测试目的在酒店管理系统的......
  • SpringBoot整合easy-es
    一、easy-es简介‌‌EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient开发的ORM框架,旨在简化开发流程并提高效率。‌EasyES在保持RestHighLevelClient原有功能的基础上进行增强,而不做任何改变。它采用与Mybatis-Plus相似的语法,使得开发者可以无缝迁移至EasyES,无......
  • SpringBoot+Vue的图书馆管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​图......
  • springboot+vue社团活动报名经费花销管理系统
    目录系统实现截图详细技术介绍核心代码部分展示其他springboot项目推荐详细视频演示源码获取社团管理系统有管理员,社长,学生三个角色。管理员功能有个人中心,活动类型管理,社长管理,学生管理,社团简介管理,社团活动管理,活动花销管理,活动结项管理,负责人更换管理,参团申请管理......