SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换
SpringBoot核心配置
SpringBoot配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用
application.properties或者application.yml(application.yaml)进行配置
-
application.properties
语法:key=value
server.port=8080
-
application.yml
语法:key:空格 value (冒号后必须要用空格)
server:port: 8080
小结:
- SpringBoot提供了2种配置文件类型:properteis和yml/yaml
- 默认配置文件名称:application
- 在同一级目录入如果三类文件共存,优先级为:properties > yml > yaml
YAML概述
YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如:C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。YAML文件的扩展名可以使用.yml或者.yaml。
properties:
server.port=8080
server.address=127.0.0.1
xml:
<server><port>8080</port><address>127.0.0.1</address>
</server>
yaml:
server:port: 8080address: 127.0.0
YAML基础语法
- 大小写
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- "#"表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML数据格式
-
基本数据类型:
#基本数据类型 boolean: True #TRUE,true,True,FALSE,false,False均可 float: 3.14 #6.8523015e+5 #支持科学计数法 int: 123 #0b1010_0111_0100_1010_1110 支持二进制、八进制、十六进制 string: HelloWorld #字符串可以直接书写
-
数组:一组按次序排列的值( List、set )
# 数组 address:- beijing- shanghai#行内写法 commpany: [阿里,华为,腾讯]
-
对象、Map(键值对)
#对象 person:name: 张三age: 25#行内写法 person1: {name:张三,age:25}#对象数组格式一 users:- name: 张三age: 4- name: 李四age: 5#对象数组格式二 users2:-name: 张三age: 4-name: 李四age: 5#对象数组缩略格式 users3: [{name:张三,age:4},{name:李四,age:5}]
-
YAML参数引用:
#参数引用 name: 王老七 person3:name: ${name}age: 22sex: 男
-
小结:
- 配置文件类型
- properties:和以前一样 (设置文件的语言编码UTF-8)
- yml/yaml:注意空格
- yaml:简洁,以数据为核心
- 基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用空格缩进表示层级关系,相同缩进表示同一级
- 数据格式
- 对象
- 数组:使用”-“表示数组的每个元素
- 基本数据类型
- 参数引用
- ${key}(EL表达式)
- 基本语法
- 配置文件类型
读取配置文件内容
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值
支持方式:
逐个注入:@Value
批量注入:
@ConfigurationProperties
Enviroment类
逐个注入
演示:
properties:
@Component //注册bean
public class Dog {@Value("阿黄")private String name;@Value("18")private Integer age;
}
加载指定的配置文件**@PropertySource** **:**加载指定的配置文件
yml:resources目录下新建一个.yml文件
name: 阿黄
age: 18
@PropertySource(value = "classpath:dog.yml")
@Component //注册bean
public class Dog{@Value("${name}")private String name;@Value("${age}")private Integer age;
}
批量注入
方式一:
Person类
@Component //注册bean到容器中
public class Person {private String name;private integer age;private boolean marry;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;//有参无参构造、get、set方法、toString()方法
}
Dog类:
public class Dog{private String name;private int age;//有参无参构造、get、set方法、toString()方法
}
编写yaml文件:
person1:name: wanglsage: 18marry: truebirth: 1990/10/19maps: {k1: v1,k2: v2}lists:- code- bodybuilding- musicdog:name: summerage: 1
数据注入到类中:
@Component //注册bean
@ConfigurationProperties(prefix = "person1")
public class Person {private String name;private Integer age;private Boolean happy;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;
}
@ConfigurationProperties的作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
如果编写完配置文件有红色提示,则可以添加坐标隐藏
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
测试:
@SpringBootTest
class SpringbootInitApplicationTests {@AutowiredPerson person;@Testvoid contextLoads() {System.out.println(person);}
}
结果:
Person{name=‘刘大脑袋’, age=22, birth=Mon Jan 01 00:00:00 CST 1990, lists=[drink, eat, play, happy], maps={car=BMW, pc=ROG}, dog=Dog{name=‘summer’, age=1}}
方式二:
直接在测试类中装配开发模式类辅助获取key对应value数据
@Autowired
private Environment env;
@Test
public void test(){System.out.println(env.getProperty("person1.name"));System.out.println(env.getProperty("person1.age"));System.out.println(env.getProperty("person1.dog.name"));System.out.println(env.getProperty("person1.lists[0]"));
}
@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图
- @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
- 松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。
- JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
- 复杂类型封装,yml中可以封装对象 , 使用value就不支持
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
JSR303数据校验
对于 web 服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分情况下,请求参数分为如下两种形式
- POST 、 PUT 请求,使用 requestBody 传递参数;
- GET 请求,使用 requestParam/PathVariable 传递参数。
什么是JSR303标准:
JSR的全称是Java Specification Requests(Java 规范提案),是指向JCP ( Java CommunityProcess )提出新增一个标准化技术规范的正式请求。
Java API 规范( JSR303 )定义了 Bean 校验的标准 validation-api ,但没有提供实现。 hibernatevalidation 是对这个规范的实现,并增加了校验注解如 @Email 、 @Length 等。 SpringValidation 是对 hibernate validation 的二次封装,用于支持 spring mvc 参数自动校验。接下来,我们以 spring-boot 项目为例,介绍 Spring Validation 的使用
JSR303校验注解的使用步骤
-
注入依赖,导入spring-boot-starter-validation启动器,pom文件导入坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
在实体类需要校验的成员字段(Field)上,添加校验注解。
@Component @ConfigurationProperties(prefix = "person4") @Validated public class Person {@NotNull(message = "姓名不能为空")private String name;@Max(message = "年龄不能超过上限",value= 120)private int age;private Date birth;private List<String> lists;private Map<String,Object> maps;private Dog dog;// 有参无参构造方法,get,set,toString()方法 }
yml:
person4:name: 刘大脑袋age: 220birth: 1990/1/1lists: [drink,eat,play,happy]maps: {car: BMW,pc: ROG}dog:name: summerage: 1
测试:
@SpringBootTest class SpringbootInitApplicationTests {@AutowiredPerson person;@Testvoid contextLoads() {System.out.println(person);} }
报错信息:
请求的参数校验
实体类:Dog
@Component
public class Dog {@NotNull(message = "狗狗的名字不能为空")private String name;@Max(message = "狗狗年龄超过上限了",value = 20)private int age;// 有参无参构造方法,get,set,toString()方法
}
在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果
@RequestMapping(path = "/vali")
@ResponseBody
public String validationDemo(@Valid Dog dog, BindingResult result) {int errorCount = result.getErrorCount();if (errorCount > 0) {List<FieldError> fieldErrors = result.getFieldErrors();for (FieldError fieldError : fieldErrors) {System.out.println("属性:{" + fieldError.getField() + "},传参是{" + fieldError.getRejectedValue() + "},报错提示信息{" + fieldError.getDefaultMessage() + "}");}return "数据不合法";} else {return "数据合法";}
}
主程序启动项目,访问URL:localhost:8080/vali?name=旺财&age=100
页面显示:数据不合法
控制台:打印拼接的报错信息
Controller统一异常处理
@ControllerAdvice:统一为Controller进行"增强"
@ExceptionHandler : 异常处理
实现步骤:
-
控制器
@RequestMapping(path = "/vali") @ResponseBody public String validationDemo(@Valid Dog dog) {return "数据合法"; }
-
新建包和类:
@ControllerAdvice // 统一异常处理注释 public class BindExceptionHandler {@ExceptionHandler(BindException.class) // 捕获的异常类型@ResponseBodypublic String handlerBindException(BindException ex, HttpServletRequest request){return "全局异常处理器捕获成功";} }
-
Dog实体类同上
-
测试:
主程序启动项目,访问URL:localhost:8080/vali?name=旺财&age=100
页面显示:全局异常处理器捕获成功
JSR303校验注解分类
- 值校验
// 被注解的元素必须为null
@Null(message = "必须为null")// 被注解的元素必须不为null
@NotNull(message = "必须不为null")// 校验注解的元素值不为空(不为null、去除首位空格后长度为0),类型为String
@NotBlank(message = "必须不为空")// 校验注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0),类型为CharSequence、Collection、Map、Array
@NotEmpty(message = "必须不为null且不为空")// 被注解的元素必须为true,并且类型为boolean
@AssertTrue(message = "必须为true")// 被注解的元素必须为false,并且类型为boolean
@AssertFalse(message = "必须为false")
- 范围校验
// 被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double
@Min(value = 18, message = "必须大于等于18")// 被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double
@Max(value = 18, message = "必须小于等于18")// 校验注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal
@DecimalMin(value = "150", message = "必须大于等于150")// 校验注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal
@DecimalMax(value = "300", message = "必须大于等于300")// 校验注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。
@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80")// 被注解的元素必须为过去的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Past(message = "必须为过去的时间")// 被注解的元素必须为未来的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Future(message = "必须为未来的时间")
- 长度校验
// 被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map
@Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")// 校验注解的元素值长度在min和max区间内 ,并且类型为String
@Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
- 格式校验
// 校验注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")// 被注解的元素必须符合指定的正则表达式,并且类型为String
@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")// 校验注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
@Email(message = "必须是邮箱")
多环境切换profile
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的;
命名语法:
例如:application-环境简称.properties/yml
- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-pro.properties/yml 生产环境
-
profile配置方式:
- 多profile文件方式
-
profile激活方式:
-
配置文件
spring:profiles:active: test #环境简称
-
虚拟机参数 :在VM options 指定:-Dspring.profiles.active=dev
-
命令行参数:java –jar xxx.jar --spring.profiles.active=dev
-
配置文件加载位置
-
配置文件加载顺序
Springboot程序启动时,会从以下位置加载配置文件: 1. file:./config/:当前项目下的/config目录下 2. file:./ :当前项目的根目录 3. classpath:/config/:classpath的/config目录 4. classpath:/ :classpath的根目录 加载顺序为上文的排列顺序,高优先级配置的属性会生效
-
外部配置加载顺序
通过官网查看外部属性加载顺序:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
java -jar XXX.jar --spring.config.location=F:/application.properties
相关文章:

SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换
SpringBoot核心配置 SpringBoot配置文件分类 SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml(application.yaml)进…...

把Qt6.2.4内置的标签打印了一遍
2023年10月31日,周二晚上 #include <QGridLayout> #include <QPushButton> #include <QLabel> #include <QApplication> #include <QStyle>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;widget.set…...
element-ui 表单校验・大全
目录 1、对全部表单项的校验2、校验指定字段3、自定义函数校验表单4、一行内多个输入框的校验 element-ui 官网 element-ui 表单校验的规则如下: <属性名>: [{ required: true,// 是否必填(若有label则在其左上角显示红点,否则不显示必…...

搭建高性能分布式存储-minio
文章目录 搭建高性能分布式存储-minioDocker搭建minio(单机部署纠删码模式)⭐创建minio的bucket(桶)⭐SpringBootminio项目实战 ⭐1:导入minio的maven依赖2:编写MinioProperties.class3:applica…...

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)
leetCode 137. 只出现一次的数字 II 题解可看我的往期文章 leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表(数字电路) 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?spm1001.2014.3001.5501…...
docker导致root空间满进入不了系统解决方案
由于docker建立镜像会产生很多缓存文件,最终导致root目录满,进入不了系统 df -h docker默认路径是在/var/lib/docker下 可以通过命令查看docker占用空间 docker system df 如果占用空间太大 可用以下命令清理 $ docker image prune -h Flag shorth…...
uni-app遮罩遮住小程序tabbar
uni-app遮罩遮住小程序tabbar 1、用uni-app自带的方法显示隐藏 //通过弹窗显隐控制导航栏的显示和隐藏 const popupChange e >{if(e.show){//隐藏tabbaruni.hideTabBar()}else{//显示tabbaruni.showTabBar()}state.searchIcon e.show } //通过弹窗显隐控制导航栏的显示和…...

Flink on yarn 加载失败plugins失效问题解决
Flink on yarn 加载失败plugins失效问题解决 flink版本:1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口,TaskMana…...
显卡服务器的特点和优势在哪里
随着科技的发展以及人们对于计算机性能的需求提高,显卡服务器是主要使用图形处理器进行计算和运算,拥有更加强大的计算能力,今天小编就来给大家讲一讲显卡服务器的特点和优势是什么! 1.高可靠性:显卡服务器采用高品质的…...

c++设计模式二:原型模式
使用场景:当需要构建多个相同的类对象时,而且该类对象结构较为复杂,如果每个都重新组织构建会很麻烦。 其实,就是写一个拷贝构造函数,或者写一个拷贝每个成员变量的clone()方法。 举例说明:比如一个相亲网站…...

【Qt控件之QMessageBox】详解
Qt控件之QMessageBox 描述基于属性的API富文本和文本格式属性严重程度以及图标和Pixmap属性静态函数API 高级用法默认按钮和退出按钮示例使用场景 描述 QMessageBox类提供了一个模态对话框,用于通知用户或向用户提问并接收答案。 消息框显示一个主要文本以提醒用户…...

SSH安全登录远程主机
SSH服务器简介 SSH即Security SHell的意思,它可以将连线的封包进行加密技术,之后进行传输,因此相当的安全。 SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。 SSH协定,在预设的状态下,…...

揭秘!产品经理提升效率的秘密武器:10款AI生成PPT工具
AI的爆炸式增长表现令人惊艳,现有的各类AI工具正在重塑各行各业,不同程度地提高人们的工作效率,并有望创造新的职业机会。但是,面对市面上数量众多的AI工具,且每周都会蹦出新的产品,即便是以好奇心富称的产…...
Oracle修改带数据的字段类型
insert into TNW_FUND_SELORG(TFDINFOID,TSOINFOID) select TFD_INFO_ID,TSO_INFO_ID from TFD_SEL_FUNDLINK_TO_OLDFUNDWEB_DB /*修改原字段名*/ ALTER TABLE 表名 RENAME COLUMN 字段名 TO 字段名1; /*添加一个和原字段同名的字段*/ ALTER TABLE 表名 ADD 字段名 VARCHAR…...

WebService接口方式和Restful接口这两者有什么区别和相同点
WebService和RESTful接口都是用于在网络上进行通信和数据交换的技术,但它们在设计和使用上有一些重要的区别和相似之处。 相同点: 基于HTTP协议:无论是WebService还是RESTful接口,它们都是通过HTTP协议进行通信的。 支持多种数据…...

jenkins自动化操作步骤(gitblit)
1、登陆地址: http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项: 1)使用父项目的pom文件:k56-boot/pom.xml 2&…...
centos中mongodb设置服务自启动并 允许远程IP访问
安装mongodb参考 注意的是配置文件需要把journal设置为true 制作为系统服务 创建MongoDB服务文件。运行以下命令创建服务文件/etc/systemd/system/mongod.service: vi /etc/systemd/system/mongod.service [Unit] DescriptionMongoDB Database Server Documenta…...

实时定位和配送追踪:开发万岳同城外卖APP的关键技术特性
随着生活节奏的不断加快,外卖服务已经成为许多人日常生活中不可或缺的一部分。无论是工作日的午餐,还是周末的家庭聚会,外卖APP已经成为满足各种美食需求的首选方式。然而,同城外卖APP的成功不仅仅取决于美味的食物选择࿰…...
数据库强化(3.存储过程)
1.什么是存储过程? 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。MySQL 5.0 版本开始支持存储过程。 它是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中&a…...

雅思小作文笔记
mostly from Simon’s methods and techniques remember the task is describe what you see, not give an opinion. Just write a report.no conclusion, just a summary(the overview) Question type 小作文的题目类型大致如上 Simon所述,在描述数字的时候&…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...

基于小程序老人监护管理系统源码数据库文档
摘 要 近年来,随着我国人口老龄化问题日益严重,独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长,随之而来的是日益突出的老年人问题,尤其是老年人的健康问题,尤其是老年人产生健康问题后&…...