SpringBoot 配置文件使用详解
一、创建一个SpringBoot项目
创建 SprintBoot 项目的 2 种方式:
- 在 https://start.spring.io/ 上创建一个 SpringBoot 项目,然后导入到 IDEA 里。
- 直接在 IDEA 上创建 SpringBoot 项目, File->New->Project, Sprint Initializr,填上相关信息。
我直接在 https://start.spring.io/ 生成一个项目然后下载下来,导入 IDEA 里。
把下载的文件解压放在 SpringBootConfigDemos 文件夹下:
二、配置文件类型
在上一小节的图中可以看到,在 src/main/resources 目录下的 application.properties
文件,这个就是创建的默认全局配置文件。
这是一种文件类型,以
.properties
后缀结尾。
还有一种以
.yml
后缀结尾的 YAML 文件类型 -application.yml/application.yaml
。
YAML 是比 properties 格式更年轻,在云原生里用的很多这种配置格式。
三、配置文件语法格式
3.1 application.properties 类型
properties 在 java 里属于比较常见的配置文件类型,语法格式: key=valve
形式,
key=value
用法例子:
server.port = 80
server.ip = 127.0.0.1
app.property.key = proname
app.property.name = tom
app.list = 1,2,3
# 还有这样语法
# 把启动命令时加入: --spring.profiles.active=dev
spring.profiles.active = ${spring.profiles.active} # 读取启动命令参数
# 属性占位符:使用${var}语法引用已经定义的属性的值
app.desc = your name is ${app.property.name}
3.2 application.yml 类型
把上面 properties 格式改成 yml 格式:
server:
port: 80
ip: 127.0.0.1
app:
property:
key: proname
name: tom
list: [1,2,3]
desc: your name is ${app.property.name}
spring:
profiles:
active: ${spring.profiles.active}
比如对于一个数组,可以这样写:
person:
hobby:
- 篮球
- 跑步
- 读书
还可以这样写:
person:
hobby: [篮球, 跑步, 读书]
YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
YAML 入门教程:
说明:YAML 格式是大小写敏感的。key: value 表示键值对关系,冒号后面必须加一个空格。
3.3 配置随机值
SpringBoot 内部提供了一个 random.*
属性,专门用于生成随机值。
属性 | 描述 |
---|---|
random.int | 随机产生正负的整数 |
random.int(max) | 随机产生 [0, max) 区间的整数 |
random.int(min,max) | 随机产生 [min, max) 区间的整数 |
random.long | 随机产生正负的长整数 |
random.long(max) | 随机产生 [0, max) 区间的长整数 |
random.long(min,max) | 随机产生 [min, max) 区间的长整数 |
random.uuid | 产生 UUID 字符串(含‘-‘字符) |
random.* | ‘*’表示除上面列举之外的其他字符,用于随机产生 32 位字符串 |
配置例子:
int-val=${random.int}
int-range-val=${random.int(2)}
uuid-val=${random.uuid}
四、配置文件加载顺序
SpringBoot 启动时会加载以下位置的 application.properties
或者 application.yml
作为默认配置文件。
- file:./config/
- file:./config/*/
- file:./
- classpath:/config/
- classpath:/
加载顺序依次从上到下,所有文件都会加载,高优先级的内容会覆盖低优先级的内容。
五、其它形式配置
5.1 其它形式配置
其实上面已经有使用到,比如读取命令行参数信息到配置文件里。这里的命令行参数也是一种动态配置信息。
其它常用配置形式:
- 系统环境变量:在 linux 中经常用到这个。
- 命令行参数:启动应用时常常会配置的运行参数。
- Java 系统属性:通过 System.getProperties() 获取的。
- 一些注解设置的属性文件,比如 @PropertySource 设置的属性文件
- 启动类 SpringApplication.setDefaultProperties 设置的默认属性
5.2 加载顺序怎样
- 命令行参数
- Java 系统属性
- 系统环境变量
- 含有 random.* 值的属性
- application-{profile}.{properties|yml}
- application.{properties|yml}
- 注解 @PropertySource 设置的属性文件
- 启动类 SpringApplication.setDefaultProperties 设置的默认属性
加载顺序依次从上到下。
六、配置信息作用
数据库连接信息保存
项目的启动信息,比如 test,dev,prod 环境,端口信息等
一些自定义配置信息,比如文件上传地址,调用第三方 url 地址、uid、密匙信息等
等等。
七:读取配置文件
7.0 绑定配置的一些规则
SpringBoot 对 *.properties
和 *.yml
文件中配置的属性名称,它提供了一些绑定规则,它不要求配置的属性名称完全与 Bean 中的属性名称相同。它支持以下几种规则的命名方式:
属性 | 描述 |
---|---|
firstName | 标准的驼峰式命名 |
first-name | 单词之间通过‘-‘分隔,Spring Boot 推荐这种 |
first_name | 单词之间通过‘_’分隔 |
FIRST_NAME | 单词全部大写并通过‘_’分隔,在使用系统环境变量时,推荐这种 |
7.1 通过 @Value 注解读取
application.yml:
server:
port: 80
ip: 127.0.0.1
通过使用注解 @Value("${属性名称}")
来将配置文件里面的值注入到程序属性中。
@Component
public class ServerConfig {
@Value("${server.port}")
public String Port;
@Value("${$server.ip}")
public String IP;
}
7.2 通过 @ConfigurationProperties 注解读取
7.2.1 @ConfigurationProperties 读取配置值
@ConfigurationProperties:将配置文件中的相关配置和类里面的属性进行绑定。
它里面有一个参数,当然这个参数也可以不填,语法如下:
@ConfigurationProperties(prefix = "xxx")
上面的 application.yml 里值也可以用如下程序来读取:
@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
public String port;
public String ip;
}
- 来一个比较复杂点例子:
application.yml 文件:
server:
port: 80
ip: 127.0.0.1
list-server:
- BJ-Server
- GZ-Server
map-server: {bj-server: 192.168.0.2, gz-server: 192.168.0.3}
dns:
bj: bj.dns.one
gz: gz.dns.two
arr-port: 8081, 8082
读取配置文件:
@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
public String port;
public String ip;
private List<String> listServer;
private Map<String, String> mapServer;
private int[] arrPort;
private Dns dns;
public static class Dns {
private String bj;
private String gz;
}
}
上面的也可以用 @Value 读取,程序跟前面例子一样。
7.2.2 @Value 和 @ConfigurationProperties 区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定属性 |
松散绑定 | 支持 | 不支持 |
SPEL(计算式) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型 | 支持 | 不支持 |
7.3 @PropertySource 加载指定配置文件
@PropertySource("email-config.properties"),加载 email-config.properties
配置文件。
同理也可以加载 .yml 的文件。
email-config.properties:
email.name = jimmy
email.from = 123@test.com
email.to = 567@yeah.com
读取配置文件值:
@Component
@PropertySource("email-config.properties")
@ConfigurationProperties(prefix = "email")
public class EmailConfig {
private String name;
private String to;
private String from;
}
八、参考
- https://docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config.files
- https://docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config
- https://docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config.command-line-args
- https://docs.spring.io/spring-framework/docs/5.3.22/javadoc-api/org/springframework/context/annotation/PropertySource.html
- https://fanlychie.github.io/post/spring-boot-properties.html
SpringBoot 配置文件使用详解的更多相关文章
- SpringBoot之DispatcherServlet详解及源码解析
在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...
- SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...
- Springboot mini - Solon详解(二)- Solon的核心
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(三)- Solon的web开发
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Nginx 主配置文件参数详解
Nginx 主配置文件参数详解 Nginx 安装完毕后,会有响应的安装目录,安装目录里 nginx.conf 为 nginx 的主配置文件, ginx 主配置文件分为 4 部分,main(全局配置). ...
- CentOS网络接口配置文件ifcfg-eth详解
======CentOS网络接口配置文件ifcfg-eth详解====== 文件 /etc/sysconfig/network-scripts/ifcfg-eth0在/etc/sysconfig/ne ...
- Apache2 httpd.conf配置文件中文版详解
Apache2 httpd.conf配置文件中文版详解## 基于 NCSA 服务的配置文件.##这是Apache服务器主要配置文件.#它包含服务器的影响服务器运行的配置指令.#参见以取得关于这些指令的 ...
- ssh2的application.xml配置文件配置详解
ssh2的application.xml配置文件配置详解 1.导入其他的配置文件.在ssh项目中可以导入其他的配置文件,导入的格式为: <import resource="clas ...
随机推荐
- Http实战之Wireshark抓包分析
Http实战之Wireshark抓包分析 Http相关的文章网上一搜一大把,所以笔者这一系列的文章不会只陈述一些概念,更多的是通过实战(抓包+代码实现)的方式来跟大家讨论Http协议中的各种细节,帮助 ...
- Hashtable集合 --练习题_计算一个字符串中每个字符出现次数
Hashtable集合 java.util.Hashtable<K,V>集合 implements Map<K,V>接口 Hashtable:底层也是一个哈希表,是一个线程安 ...
- Windows对拍系统
有个东西可以帮助对拍,告诉你两个程序的输出哪不一样(但是无法得知错误位置,聊胜于无吧) 一.打开计算机 二.在上方输入$cmd$,摁下回车 三.弹出对话窗如下,输入$fc +$空格,输入两个需要比较 ...
- Windows 远程连接后,自动断开,所有程序都自动关闭(待验证,待更新)
win+r输入regedit打开注册表编辑SecurityLayer,将值改为2 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Ter ...
- 05 MySQL_主键约束
主键约束 主键: 用于表示数据唯一性的字段称为主键: 约束:就是对表字段添加限制条件 主键约束:保证主键字段的值唯一且非空: - 格式 : create table t1(id int primary ...
- 函数式接口的概念&函数式接口的定义和函数式接口的使用
函数式接口概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambd ...
- SP8496 NOSQ - No Squares Numbers 题解
To SP8496 这道题可以用到前缀和思想,先预处理出所有的结果,然后 \(O(1)\) 查询即可. 注意: 是不能被 \(x^2(x≠1)\) 的数整除的数叫做无平方数. \(d\) 可以为 \( ...
- srec_cat 常用参数的使用
前言 下面介绍映像文件工具 srec_cat 的使用,如何通过相关参数实现自己需要的功能. 下载链接:SRecord 使用方式 文件类型 在输入文件和输出文件文件时要指明文件类型,常用的如: test ...
- python jinjia2 使用语法
简介 对于jinjia2来说,模板仅仅是文本文件,可以生成任何基于文本的文件格式,例如HTML.XML.CSV.LaTex 等等,以下是基础的模板内容: <!DOCTYPE html> & ...
- SkiaSharp 之 WPF 自绘 拖曳小球(案例版)
感谢各位大佬和粉丝的厚爱和关心( 催更),我会再接再厉的,其实这也是督促自己的一种方式,非常感谢. 刚写了一篇万字长文,自己也休养生息(低调发育)了一段时间,接下来来几个小案例. 拖曳小球 WPF的拖 ...