SpringBoot 配置文件

1. 配置文件的作用

配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息,放在⼀个集中的地方, 当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行。

  • 硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中, 也就是我们常说的"代码写死"。
  • 比如手机字体大小
    • 如果采用硬编码的⽅式, 就直接在程序中指定字体大小, 所有的用户使用的都是同⼀个字体大小
    • 但是不同的用户有不同的偏好, 我们可以把手机字体的大小放在配置文件中, 当程序启动时, 读取配置, 以用户设置的字体大小来显示。

使用配置文件, 可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。

2. SpringBoot 配置文件

SpringBoot支持并定义了配置文件的格式,也在另⼀个层面达到了规范其他框架集成到SpringBoot的目的。

很多项目或者框架的配置信息也放在配置文件中,比如:

  • 项目的启动端⼝
  • 数据库的连接信息(包含用户名和密码的设置)
  • 第三方系统的调用密钥等信息
  • 用于发现和定位问题的普通日志和异常日志等

项目的启动端口 :SpringBoot内置了Tomcat服务器, 默认端⼝号是8080,但是用户电脑上8080端口号有可能就被其他应用程序占用了, 所以SpringBoot需要支持让用户自定义端⼝号

数据库连接信息 :为了更方便简单的访问数据库,出现了⼀些持久层框架, 其实就是对JDBC进行了更深层次的封装.让用户通过简单几行代码就可完成数据库的访问。但是不同的应用程序访问的数据库不同, 这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。

可以通过配置文件来修改服务的端口号。

SpringBoot 在创建项目时, 就已经帮我们创建了配置文件:

修改 application.properties 文件:

重新运行程序, 观察日志:显示Tomcat启动端口号为9090

3. 配置文件格式

Spring Boot 配置文件有以下三种:

  • application.properties
  • application.yml
  • application.yaml

yml 为yaml的简写, 实际开发中出现频率最高,yaml 和yml 的使用方式⼀样。

当应用程序启动时, Spring Boot会自动从classpath路径找到并加载 application.properties 和 application.yaml 或者 application.yml 文件。

说明:

  1. 理论上讲,.properties 和 .yml 可以并存在于⼀个项目中 ,当 .properties 和 .yml 并存时,两个配置都会加载,如果配置文件内容有冲突, 则以 .properties 为主 , 也就是 .properties 优先级更高
  2. 虽然理论上来讲,.properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置文件格式,这样可以更好的维护(降低故障率)。

4. properties 配置文件说明

① 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以 "=" 连接的,key 的所有单词小写,单词之间使用 点(.) 来分割,如:

② 读取配置文件

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。

@Value 的作用:用于将单个配置项、系统属性、环境变量或 SpEL 表达式的值,注入到 Bean 的字段、方法参数或构造器参数中。

@Value 注解使用 " ${} " 的格式读取,如下代码所示:

访问:http://127.0.0.1:9090/properties/read

③ properties 缺点分析

properties 配置是以 key-value 的形式配置的,如下图所示:

从上述配置key看出,properties 配置文件中会有很多的冗余的信息,比如这些:

想要解决这个问题,就可以使用 yml 配置文件的格式化了。

5. yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是"另⼀种标记语言我们先来学习yml的语法

① 基本语法

yml 是树形结构的配置⽂件,它的基础语法是 "key: value".

key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略。

基础语法如下:

使用 yml 连接数据库:

和 properties 连接数据库的配置对比,去掉了一些冗余信息。

② yml 使用

yml 配置不同数据类型及null

③ 读取配置文件

yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:

yml 配置:

@PostConstruct

为了方便观察,这里介绍一个注解 @PostConstruct ,@PostConstruct 的作用是:标记一个初始化方法,让容器在依赖注入完成后、Bean 正式使用前自动调用一次。即 @PostConstruct 在构造方法之后、依赖注入之后、Bean 正式使用之前执行。

Spring 创建一个 Bean,大概做这几件事:

    1. 调用构造方法,new 出对象
    1. 给对象注入依赖(@Autowired、setter 等)
    1. 调用 @PostConstruct 方法
    1. 再调用其他初始化方法(如果有)
    1. Bean 准备完毕,可以被别人使用了

读取 yml 文件:

运行结果:

  • 构造方法 -> 依赖注入 -> @PostConstruct -> 整个应用启动完成

注意事项:value 值加单双引号

字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。

尝试在 application.yml 中配置如下信息:

读取:

从上述结果可以看出:

  1. 字符串默认不用加上单引号或者双引号。
  2. 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
  3. 双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义.

④ 配置对象

在 yml 中配置对象:

写法和获取属性一样,只是不再是使用 @Value 注解来读,而是使用另⼀个注解 @ConfigurationProperties 来读取。

作用:把配置文件中,某个前缀下的所有配置项,一次性自动绑定到一个 Java Bean 的属性上。

@ConfigurationProperties 中prefix 属性的作用:让 Spring Boot 去配置文件里找以这个前缀开头的所有属性,把它们批量绑定到当前类的字段上,不可省略。


将配置文件中 person 对象的属性批量绑定到 Person 类中的属性上,让该类中的属性赋上配置文件中对应属性的值:

然后将Person类进行依赖注入,读取配置文件中的person对象:

⑤ 配置集合

配置文件也可以配置 list 集合,如下所示:

集合的读取和对象⼀样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

读取集合:

【配置集合和配置数组的方式是一样的,只需要将List类换成一个数据即可】

⑥ 配置Map

⑦ yml 优缺点

优点:

  1. 可读性高,写法简单, 易于理解
  2. 支持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
  3. 支持更多的编程语言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用

缺点:

  1. 不适合写复杂的配置文件
  2. 对格式有较强的要求
相关推荐
特立独行的猫A15 分钟前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩21 分钟前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
聪明的笨猪猪27 分钟前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
文丑颜不良啊27 分钟前
LeetCode2501~2520题目解析
java·leetcode
瑞雪兆丰年兮43 分钟前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
唐老板1 小时前
Spring Boot 4 默认开虚拟线程,HikariCP 却成瓶颈
java
2601_9621066411 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice11 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_9621066412 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
RuoyiOffice12 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office