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. 对格式有较强的要求
相关推荐
步行cgn11 分钟前
Spring MVC POST 请求乱码:原因与完整解决方案
java·spring·mvc
y1su12 分钟前
Leetcode 链表,树,回溯 模板
java·leetcode·链表
qianyuqiye116 分钟前
K8s 命名空间与 Pod 入门:从概念到实战
java·docker·kubernetes
牧瀬クリスだ25 分钟前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
小张成长计划..28 分钟前
【Linux】26:线程互斥和同步
java·开发语言
邪修king3 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料3 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y4 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
曹牧9 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer