当前位置: 首页 > news >正文

SpringBoot 配置文件使用详解

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

一、创建一个SpringBoot项目

创建 SprintBoot 项目的 2 种方式:

  1. 在 https://start.spring.io/ 上创建一个 SpringBoot 项目,然后导入到 IDEA 里。
  2. 直接在 IDEA 上创建 SpringBoot 项目, File->New->Project, Sprint Initializr,填上相关信息。

我直接在 https://start.spring.io/ 生成一个项目然后下载下来,导入 IDEA 里。

image-20220915223725068

把下载的文件解压放在 SpringBootConfigDemos 文件夹下:

image-20220915223918315

二、配置文件类型

在上一小节的图中可以看到,在 src/main/resources 目录下的 application.properties 文件,这个就是创建的默认全局配置文件

这是一种文件类型,以 .properties 后缀结尾。

还有一种以 .yml 后缀结尾的 YAML 文件类型 - application.yml/application.yaml

YAML 是比 properties 格式更年轻,在云原生里用的很多这种配置格式。

三、配置文件语法格式

3.1 application.properties 类型

properties 在 java 里属于比较常见的配置文件类型,语法格式: key=valve 形式,

Copykey=value

用法例子:

Copyserver.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 格式:

Copyserver:
  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}

比如对于一个数组,可以这样写:

Copyperson:
  hobby:
    - 篮球
    - 跑步
    - 读书

还可以这样写:

Copyperson:
  hobby: [篮球, 跑步, 读书]

YAML 支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

YAML 入门教程:

说明:YAML 格式是大小写敏感的。key: value 表示键值对关系,冒号后面必须加一个空格

  • https://yaml.org/
  • https://www.runoob.com/w3cnote/yaml-intro.html

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 位字符串

配置例子:

Copyint-val=${random.int}
int-range-val=${random.int(2)}
uuid-val=${random.uuid}

四、配置文件加载顺序

SpringBoot 启动时会加载以下位置的 application.properties 或者 application.yml 作为默认配置文件。

  1. file:./config/
  2. file:./config/*/
  3. file:./
  4. classpath:/config/
  5. classpath:/

加载顺序依次从上到下,所有文件都会加载,高优先级的内容会覆盖低优先级的内容。

五、其它形式配置

5.1 其它形式配置

其实上面已经有使用到,比如读取命令行参数信息到配置文件里。这里的命令行参数也是一种动态配置信息。

其它常用配置形式:

  1. 系统环境变量:在 linux 中经常用到这个。
  2. 命令行参数:启动应用时常常会配置的运行参数。
  3. Java 系统属性:通过 System.getProperties() 获取的。
  4. 一些注解设置的属性文件,比如 @PropertySource 设置的属性文件
  5. 启动类 SpringApplication.setDefaultProperties 设置的默认属性

5.2 加载顺序怎样

  1. 命令行参数
  2. Java 系统属性
  3. 系统环境变量
  4. 含有 random.* 值的属性
  5. application-{profile}.{properties|yml}
  6. application.{properties|yml}
  7. 注解 @PropertySource 设置的属性文件
  8. 启动类 SpringApplication.setDefaultProperties 设置的默认属性

加载顺序依次从上到下。

六、配置信息作用

  1. 数据库连接信息保存
  2. 项目的启动信息,比如 test,dev,prod 环境,端口信息等
  3. 一些自定义配置信息,比如文件上传地址,调用第三方 url 地址、uid、密匙信息等

等等。

七:读取配置文件

7.0 绑定配置的一些规则

SpringBoot 对 *.properties*.yml 文件中配置的属性名称,它提供了一些绑定规则,它不要求配置的属性名称完全与 Bean 中的属性名称相同。它支持以下几种规则的命名方式:

属性描述
firstName标准的驼峰式命名
first-name单词之间通过‘-‘分隔,Spring Boot 推荐这种
first_name单词之间通过‘_’分隔
FIRST_NAME单词全部大写并通过‘_’分隔,在使用系统环境变量时,推荐这种

7.1 通过 @Value 注解读取

application.yml:

Copyserver:
  port: 80
  ip:   127.0.0.1

通过使用注解 @Value("${属性名称}") 来将配置文件里面的值注入到程序属性中。

Copy@Component
public class ServerConfig {
    
    @Value("${server.port}")
    public String Port;
    
    @Value("${$server.ip}")
    public String IP;
}

7.2 通过 @ConfigurationProperties 注解读取

7.2.1 @ConfigurationProperties 读取配置值

@ConfigurationProperties:将配置文件中的相关配置和类里面的属性进行绑定。

它里面有一个参数,当然这个参数也可以不填,语法如下:

Copy@ConfigurationProperties(prefix = "xxx")

上面的 application.yml 里值也可以用如下程序来读取:

Copy@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
    
    public String port;
    
    public String ip;
}

  • 来一个比较复杂点例子:

application.yml 文件:

Copyserver:
  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

读取配置文件:

Copy@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
    
    public String port;
    public String ip;
    private List listServer;
 private Map 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:

Copyemail.name = jimmy
email.from = 123@test.com
email.to = 567@yeah.com

读取配置文件值:

Copy@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

相关文章:

  • LeetCode 验证回文串
  • 基于STM32单片机和AD9850的智能DDS函数信号发生器
  • Java高并发编程实战2,原子性、可见性、有序性,傻傻分不清
  • 【机器学习】李宏毅——AE自编码器(Auto-encoder)
  • STM32CUBEMX开发GD32F303(14)----IIC之配置OLED
  • TCP三次握手建立连接和四次挥手释放连接
  • 【牛客刷题-算法】NC7 买卖股票的最好时机(一)
  • 牛客网面试必刷TOP101之——判断对称二叉树、求镜像二叉树与合并二叉树
  • JavaSE笔记(二)重制版
  • 【LabVIEW专题】LabVIEW 通过串口进行Modbus协议通信
  • 软件分享-
  • java扶贫平台计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • 十年数据库专家,呕心力作MySQL技术精粹,薪资直涨3K其实很轻松
  • D. Empty Graph #813 div2
  • 02 NLP合集-神经网络从0开始推理-一个间的神经网路的预测-没有backforward的情况下
  • 【Leetcode】101. 对称二叉树
  • ES6指北【2】—— 箭头函数
  • [译]CSS 居中(Center)方法大合集
  • Consul Config 使用Git做版本控制的实现
  • Docker下部署自己的LNMP工作环境
  • es的写入过程
  • JavaScript 基本功--面试宝典
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Phpstorm怎样批量删除空行?
  • python 学习笔记 - Queue Pipes,进程间通讯
  • REST架构的思考
  • sublime配置文件
  • web标准化(下)
  • 技术:超级实用的电脑小技巧
  • 全栈开发——Linux
  • 如何胜任知名企业的商业数据分析师?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (九十四)函数和二维数组
  • (十六)串口UART
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)ObjectiveC 深浅拷贝学习
  • .jks文件(JAVA KeyStore)
  • .Net 4.0并行库实用性演练
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core 项目指定SDK版本
  • .NET Micro Framework初体验(二)
  • .NET MVC之AOP
  • .net web项目 调用webService
  • .Net Web项目创建比较不错的参考文章
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @GlobalLock注解作用与原理解析
  • @ModelAttribute 注解
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [20150904]exp slow.txt
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [android] 切换界面的通用处理