SpringBoot【实用篇】- 配置高级
文章目录
- 目标:
- 1.@ConfigurationProperties
- 2.宽松绑定/松散绑定
- 3. 常用计量单位绑定
- 4.数据校验
目标:
- @ConfigurationProperties
- 宽松绑定/松散绑定
- 常用计量单位绑定
- 数据校验

1.@ConfigurationProperties
@ConfigurationProperties 在学习yml的时候我们了解到它是可以给对象进行属性注入的,有那么几个前提,yml中有配置,项目中有对应的实体类,用于封装数据且属性名一一对应
我在我的com.example包下创建了一个config的包包中写了这样一个类:
import org.springframework.stereotype.Component;
import lombok.Data;@Component //因为这个类要被Spring管理,所以加上注解@Component
@Data
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}
yml中
servers:ipAddress: 192.168.200.140port: 2345timeout: -1
我们想为上面的类赋上我们的配置文件的值就需要加上@ConfigurationProperties(prefix = "servers")
@Component //因为这个类要被Spring管理,所以加上注解@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}
验证: 这里选择在引导类中进行测试
import com.example.config.ServletConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class ConfigurationLearnApplication {public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象}}

但是又有一个问题:这个bean是我们自定义的bean,这个bean如果不是自定义的呢?如果是第三方的bean呢?如果这是一个数据源的bean,需要使用第三方bean加载的时候,该怎么做呢?这就是我们接下来要解决的。
假如我们这里引入一个第三方bean:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.21</version></dependency>
然后我们去定义这个第三方bean,可以再创建一个配置类,但是这里我们就直接使用我们的引导类做演示即可
@SpringBootApplication
public class ConfigurationLearnApplication {@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();return dataSource;}public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象DruidDataSource ds = ctx.getBean(DruidDataSource.class);//拿到第三方bean对象System.out.println(ds);//打印第三方bean对象}
}

显示的是这个数据源初始化好以后的值,但是只有在druid连接到数据库的时候才会真正的初始化,这个属于是懒加载。
我们手动设置一下
@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}
在main方法中打印即可验证
System.out.println(ds.getDriverClassName());

你写什么都可以,因为这里还不是真正的连接.这里是我们自己设置的,我们也可以注入进来通过yml,注入到第三方对象上
datasource: driverClassName: com.mysql.jdbc.Driver456
然后我们到引导类中修改一下:
@SpringBootApplication
public class ConfigurationLearnApplication {@Bean@ConfigurationProperties(prefix="datasource")public DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();
// dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象DruidDataSource ds = ctx.getBean(DruidDataSource.class);//拿到第三方bean对象System.out.println(ds);//打印第三方bean对象System.out.println(ds.getDriverClassName());}
}

@EnableConfigurationProperties 与 @ConfigurationProperties 有什么关系吗?
我们会在SpringBoot中看到大量前面有Enable的东西,我们可以理解为1一种开关,启用那些配置类
在引导类上我们加上这行代码:
@EnableConfigurationProperties(ServletConfig.class) // 启用配置类 如果有多个可以用 {} 包裹起来
结果运行之后发现报错啦!
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.config.ServletConfig' available: expected single matching bean but found 2: servletConfig,servers-com.example.config.ServletConfig
matching bean but found 2: 为什么会有两个bean? 在我们前面使用SevletConfig这个类的时候我们使用了@Component注解,我们把它注释掉,然后@EnableConfigurationProperties 是在告诉spring容器,我们现在有一组信息要去加载配置,如果这个东西它不被spring容器管理那它如何加载这些配置呢?
因此,这里自动把Servlet.class注入到了Spring容器中.


小结:@ConfigurationPropperties 可以为第三方1bean绑定属性
2.宽松绑定/松散绑定
但是如果我们先在配置文件yml中将datasource改成了dataSource
然后再在@ConfigurationProperties(prefix = “dataSource”)(改完后) ,
会发现报错了绑定不上

@ConfigurationProperties对于名称上的绑定其实是非常灵活的,Spring为了满足各种开发者的习惯,它提供了多种名称规范.
servers:ipAddress: 192.168.200.140port: 2345timeout: -1
配置类:
@Data
@ConfigurationProperties(prefix = "servers")
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}
ipAddress一一对应是能用的.
但其实配置文件中的ipAdress其实是可以改动的.比如:ipaddress,ip_address,ip-address,IPADDRESS,IP_ADDRESS,IP_ADD_R_E_SS,IP_ADD_R_S-S这些都可以,但是主流格式是:ip-address 它有个有趣的名字叫烤肉串模式


注:宽松绑定不支持注解@Value引用单个属性的方式


小结:
- @ConfigurationProperties绑定属性支持属性名宽松绑定
- @Value注解不支持松散绑定
- 绑定前缀命名命名规则
3. 常用计量单位绑定
假如我们在yml中有这样的配置:
server:timeout: 30000000000
这样不太直观,到底多少位,而且单位是什么?
我们下面来解决这个问题:
JDK8一系列与单位有关的数据类型,其中有一个专门来描述数据范围的Duration
我们在yml 中加入这样一项: serverTimeOut: 3
然后到配置类中: private Duration serverTimeOut;
这里3 代表什么呢? => 3毫秒
我们可以定义单位:
@DurationUnit(ChronoUnit.SECONDS)private Duration serveTimeout;
也可以配置存储容量 dataSize
@DataSizeUnit(DataUnit.MEGABYTES)//private DataSize dataSize;
yml:
dataSize: 1024

但是也太难阅读啦~
如果你把dataSize: 10MB
然后把@DataSizeUnit去掉

10485760 / 1024 =10240
10240 / 1024 = 10
这样看起来更直观


4.数据校验
如果我们在配置文件中配置的时候本来想配置端口123的一不小心写成了a,那这样就会报错

那我们就需要做格式校验validation
数据校验
- 开启数据校验有助于系统1安全性,J233规范中JSR303规范定义了一组有关数据校验相关的API
我们只需要使用这个API即可,引入这个坐标

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency>
那这套东西相当于什么呢?
我们用java链接数据库用到了JDBC技术,那问题来了,JDBC是一个接口还是实现类呢?是一个接口。我们用的是Mysql的驱动,这个是实现类,JDBC是一个规范,而mysql驱动是一个数据库的实现类,这里如此。validation是一组接口,还需要导入对应的实现依赖
@Max(value = 8888, message = "端口号不能超过8888")@Min(value = 80, message = "端口号不能小于80")private int port;
但是很遗憾报错了,因为接口给我们了,我们没有实现它。就像Servelt是Tomcat实现的,JDBC 是mysql驱动实现的,现在要用校验框架,那实现却没有,因此报错。

上面图中有一个such as Hibernate Valiator 这个Hibernate校验器是个什么东西?

<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>
这里我们就是使用hibernate框架提供的校验器做实现类,这样运行后就可以正常运行了。如果我们的配置不符合规定会报错误。

除此之外,hibernate也给我们提供了一些东西


这里提供的方法更多
总结:



本章最后一节我们讲一个问题:配置一个数据库的信息,但是一直连不上,报的错误是密码错误,但是用navicat却能够正常连接,这个问题不是数据库的问题,而是springboot的问题,下面我们来模拟这个问题:
datasource:driverClassName: com.mysql.jdbc.Driver7122password: 0127
测试类:
@SpringBootTest
class ConfigurationLearnApplicationTests {@Value("${servers.ipAddress}")private String msg;@Value("${datasource.password}")private String password;@Testvoid contextLoads() {System.out.println(msg);System.out.println(password);}}

忽略上面那个,忘记注释了。哈哈哈哈
为什么是87呢?如果修改一下配置文件
datasource:driverClassName: com.mysql.jdbc.Driver7122password: "0127"

那为什么?

八进制的格式:0(0-7)
十六进制0x(0-9,a-f)
所以懂了叭~这是格式转换问题 !
小结:
注意yml文件中对于数字的定义支持进制书写格式,如需要使用字符串请使用引号明确标注
相关文章:
SpringBoot【实用篇】- 配置高级
文章目录 目标:1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标: ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…...
liunx CentOs7安装MQTT服务器(mosquitto)
查找 mosquitto 软件包 yum list all | grep mosquitto出现以上两个即可进行安装,如果没有出现则需要安装EPEL软件库。 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm查看 mosquitto 信息 yum info mosquitto安装 mosquitt…...
【银河麒麟高级服务器操作系统】虚拟机lvm分区丢失现象分析及解决建议
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 环境描述 系统环境 物理机/虚拟机/云/容器 虚拟…...
Android 原子性类型都有哪些
1. 基本类型原子类 AtomicInteger:用于对整数进行原子操作,如incrementAndGet()方法可以原子地将当前值加1并返回新值,getAndSet()方法可以原子地设置新值并返回旧值。AtomicLong:和AtomicInteger类似,用于长整型的原…...
MySQL(上)
一、SQL优化 1、如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说&a…...
ffplay 实现视频流中音频的延迟
ffplay -rtsp_transport tcp -i rtsp://admin:1234qwer192.168.1.64:554/Streaming/Channels/101 -vn -af "adelay5000|5000"在这个命令中: -vn 参数表示只播放音频。 -af "adelay5000|5000" 参数表示将音频延迟5000毫秒(即5秒&…...
CSDN资源变现
根据搜索结果,CSDN资源变现主要有以下几种方式: 1、上传付费资源: 用户可以在CSDN上上传资源并设置付费,其他用户支付费用下载这些资源,上传者则获得一部分收益。这种方式适合上传大量资源,通过量变达到质变…...
Rembg模型构建教程
一、介绍 Rembg,全称为“Remove Background”,是一款基于深度学习的图像背景去除工具。它的主要功能是通过智能识别图像中的前景物体,并将其从背景中分离出来,从而创建具有透明背景的图像。 二、基础环境 系统:Ubun…...
向量的基础知识和矩阵向量的坐标旋转
向量的基础: 定义: 既有大小,又有方向的量叫做向量(Vector)。 在几何上,向量用有向线段来表示,有向线段长度表示向量的大小,有向线段的方向表示向量的方向。其实有向线段本身也是向…...
GeoSever发布图层(保姆姬)
发布服务的具体步骤。 1. 安装 GeoServer 下载 GeoServer 安装包:GeoServer 官网按照安装说明进行安装,可以选择 Windows、Linux 或其他平台。 2. 启动 GeoServer 启动 GeoServer 通常通过访问 http://localhost:8080/geoserver 进行。默认用户名和密…...
AI 大模型的发展趋势是怎样的?
AI 大模型的发展趋势呈现出多方面的特点,包括技术、应用、商业模式等多个维度,具体如下: 技术层面: 多模态融合:未来,AI 大模型将不断加强对多模态数据的处理能力,融合文本、图像、音频、视频等…...
win10怎么关掉自动更新-小白必看
1.搜索栏搜索服务单机点开 2.在服务里面找到windows Update服务双击进去 3.如下图把他禁用然后点应用即可...
大学城水电资源管理:Spring Boot解决方案
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理大学城水电管理系统的相关信息成为必然。开…...
躺平成长-运营日记-第三天
开源竞争: (自己没有办法完全掌握技术的时候就开源掉,培养出更多的技术依赖,让更多的人完善你的技术,那么这不就是在砸罐子吗?一个行业里面你不去砸罐子,其他人就会砸罐子,你不如先砸…...
智慧税务管理:金融企业报税效率与合规性提升
前言 在数字化浪潮席卷全球的今天,金融行业正面临前所未有的挑战与机遇。如何在复杂的税务环境中保持合规并提高效率,已成为每个金融企业的重中之重。今天小编就为大家介绍一下如何通过借助智能税务平台,实现税务管理的智能化革新࿰…...
linux之网络子系统-用户层接收数据包之同步阻塞方案
一、前言 之前讲述了网络包是如何从网卡送到协议栈的,接下来内核还有一项重要的工作,就是在协议栈接收处理完输入包后要通知到用户进程,如何用户进程接收到并处理这些数据。 进程与内核配合有多种方案,这里我们这分析两种典型的…...
【天线&空中农业】花生霉变检测系统源码&数据集全套:改进yolo11-LVMB
改进yolo11-goldyolo等200全套创新点大全:花生霉变检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视…...
全志A133 android10 LVDS幅值调节
一,问题现象 系统使用LVDS接口屏幕,进入系统有些界面会闪,图像抖动; 二,解决办法: 1.调试 调节LCD0的LVDS电压幅度,寄存器地址是0x06511220(具体是在User Manual中的LCD LVDS Ana…...
弃用 RestTemplate,来了解一下官方推荐的 WebClient !
在 Spring Framework 5.0 及更高版本中,RestTemplate 已被弃用,取而代之的是较新的 WebClient。这意味着虽然 RestTemplate 仍然可用,但鼓励 Spring 开发人员迁移到新项目的 WebClient。 WebClient 优于 RestTemplate 的原因有几个ÿ…...
西圣、倍思、品胜电容笔孰强孰弱?多维度对比测评三款平替电容笔
在近年来,平替电容笔以其亲民的价格和优质的性能变现,成为市场上备受追捧的选择。然而,某些品牌为了吸引消费者,降低价格的同时常采用劣质材料,结果握笔体验差,书写效果糟糕,甚至在长时间使用后…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
