7. Spring Boot 配置文件

目录

1. 配置文件作用

2. 配置文件格式

3. properties 配置文件说明

3.1 properties 基本语法

3.2 读取配置文件

3.3 缺点

4. yml 配置文件说明

4.1 properties 基本语法

4.2 读取配置文件

4.3 yml 配置不同的数据类型

布尔值

整数值

 null 值

配置对象

 配置集合

配置 Map

Banner 

多平台的文件配置

4.4 优点

5 properties VS yml


1. 配置文件作用

整个项目中所有重要的数据都是在配置文件中配置的,比如:

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

如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

2. 配置文件格式

Spring Boot 配置文件主要分为以下两种格式:

  • .properties
  • .yml

properties 类型的配置文件属于“旧款”,是创建 Spring Boot 项目时默认的文件格式;而 yml 属于新版款式,如果用户需要新款则使用新款。

1. 理论上讲 properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在于⼀个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”, 那么这个时候会以 properties 中的配置为主,也就是 .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息。

2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。

3. properties 配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。

配置文件包括:

  • Spring 的配置
  • 自定义配置

3.1 properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:

# 配置项目端口号
server.port=9090
# 数据库配置信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

# 自定义配置
mykey.key1=aaa

key (= 前面)只要是字符串就可以。 但是规范为:全部小写,单词之间使用 . 分割

一般来说,类名:首字母大写(大驼峰)

变量名:首字母小写(小驼峰)

常量:全大写,单词之间使用_分割

3.2 读取配置文件

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

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

@RestController
public class ValueController {
    @Value("${mykey.key1}")
    private String key1;

    @PostConstruct
    public void postConstruct(){
        System.out.println("===========================");
        System.out.println("key:" + key1);
    }
    public String hi(){
        return "hi~ ValueController...";
    }
}

我们通过 @Value 获取自定义的配置文件中的值。

如果我们去掉 ${},那么可以看到最终结果直接将双引号里面的值赋值给了 key1 变量:

@RestController 在Spring Boot 启动时会注入到框架中,注入到框架中时会执行 @PostConstruct 初始化方法,此时就能读取到配置信息了。 

3.3 缺点

properties 配置是以 key-value 的形式配置的,因此配置文件中会有很多的冗余的信息

4. yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另⼀种标记语 言”。

4.1 properties 基本语法

yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒号加空格的方式组成的,其中的空格不可省略

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
    username: root
    password: root

4.2 读取配置文件

同样通过@Value 注解使用“${}”的格式读取:

@RestController
public class ValueController {
    @Value("${spring.datasource.username}")
    private String sqlusername;

    @PostConstruct
    public void postConstruct(){
        System.out.println("===========================");
        System.out.println("sqlusername:"+sqlusername);
    }
    public String hi(){
        return "hi~ ValueController...";
    }
}

4.3 yml 配置不同的数据类型

布尔值
mykey:
  key1: true

整数值
mykey:
  key1: 10

 null 值
mykey:
  key1: ~

 对于单引号和双引号的区别:

String:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

配置对象
Student:
  id: 1
  name: danny
  age: 18
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

我们可以看到直接写上面一个类非常麻烦,需要加入 get 和 set 方法,因此,我们可以通过添加注解 @Data 来帮助我们直接写 get 和 set 方法,以及 toString 方法,还有一些构造函数。 

@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

通过五大注解接收对象,将对象存放至 Spring 中,此处使用 @Component 注解;

通过 @ConfigurationProperties(prefix = "student") 将 yml 文件中的 Student 赋值给这个对象(“prefix =”可以省略),此处的 student 首字母要小写。

@RestController
public class ValueController {

    @Autowired
    private Student student;
    @PostConstruct
    public void postConstruct(){
        System.out.println("===========================");
        System.out.println(student);
        System.out.println("===========================");
    }
    public String hi(){
        return "hi~ ValueController...";
    }
}

 配置集合
Student:
  id: 1
  name: danny
  age: 18
  dbtypes:
    - mysql
    - sqlserver
    - db2
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    
    private List<String> dbtypes;
}

配置 Map
Student:
  id: 1
  name: danny
  age: 18
  dbtypes:
    - mysql
    - sqlserver
    - db2
  map2:
    k1: kk1
    k2: kk2
    k3: kk3
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    private List<String> dbtypes;
    private Map<String,String> map2;
}

Banner 

我们可以通过在线工具直接生成 banner:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner,轻松修改替换实现自定义banner,让banner.txt文件内容更有趣,是很棒的Spring Boot banner自定义和命令行ascii文字工具,还可以生成linux、MAC各系统命令行终端ascii文字,有了它你的项目会变得有意思。https://www.bootschool.net/ascii

我们选择下载文件,将下载好的文件命名为 banner.txt 粘贴在 idea 的 resource 文件夹下:

重新运行程序,可以看到此时生成的是我们刚刚设置的文件:

多平台的文件配置

实际工作中的开发环境分为开发环境(自测)、测试环境(测试人员进行测试,测试环境的数据都是测试人员/开发人员造的数据,是假数据)、预发布环境和发布环境(通常数据是一样的,都是线上真实的用户数据)。

我们希望在不同的配置环境中执行不同的配置文件,因此将主文件中的配置注释,并进行设置: 

@RestController
public class ValueController {
    @Value("${spring.datasource.username}")
    private String sqlusername;
    @Value("${spring.datasource.password}")
    private String password;

    @Autowired
    private Student student;
    @PostConstruct
    public void postConstruct(){
        System.out.println("===========================");
        System.out.println("sqlusername:"+sqlusername);
        System.out.println("password:"+password);
        System.out.println("===========================");
    }
    public String hi(){
        return "hi~ ValueController...";
    }
}

设置为 test 环境下: 

设置为 prod 环境下: 

综上,多平台文件配置的步骤可以总结如下: 

  1. 先写各个环境的配置文件:application-xxx.yml
  2. 在主配置文件 application.yml 中设置环境参数

4.4 优点

yml 的优点:

  1. yml 可读性高,写法简单、易于理解,它的语法和 JSON 语言类似。
  2. yml 支持更多的数据类型,它可以简单表达清单 (数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
  3. yml 支持更多的编程语言,它不止是 Java 中可以使用,在 Golang、PHP、Python、Ruby、JavaScript、Perl 中同样可以使用。

5 properties VS yml

  1. properties 是以 key=value 的形式配置的键值类型的配置⽂件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用“: ”英文冒号加空格的方式设置,并且空格不可省略
  2. properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
  3. yml 通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置文件作为 Java 和 Go 的共同配置文件。
  4. yml 支持更多的数据类型。

当我们关闭再打开 idea,可以看到 .properties 文件出现了乱码:

因为它的格式为:

而 .yml 文件的格式为:

因此需要修改 .properties 文件的格式:

之后再打开 .properties 文件不会再出现乱码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产化 | 记一次基于达梦创建数据库模式思考过程

开篇 首先&#xff0c;我们先来了解一下达梦数据库中用户与模式的概念&#xff0c;以及用户与模式之间的关系。 用户&#xff1a;主要是用来登录连接数据库&#xff0c;以及操作数据库对象等等。 模式&#xff1a;数据库中相关对象的集合。 关系&#xff1a;用户&#xff0…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)六:后台主页功能实现下

一、本章内容 接上一章,继续实现后端主页内容,主要实现工具栏对应相关内容的实现,包括系统消息、系统公告、全屏切换、语言切换、主题切换等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集…

Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据

在我之前的文章&#xff1a; Elasticsearch&#xff1a;如何使用 Elasticsearch ingest 节点来丰富日志和指标 Elasticsearch&#xff1a;enrich processor &#xff08;7.5发行版新功能&#xff09; 我有详细描述如何使用 ingest pipeline 来丰富数据。在今天的文章中里&am…

【已解决】 Celery 报错:AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘

【已解决】 Celery 报错&#xff1a;AttributeError: EntryPoints object has no attribute get 1、起因2、实验环境3、解决方案 1、起因 今天闲来无事学习 Celery 分布式任务队列&#xff0c;写好代码发布并执行&#xff0c;报错了 AttributeError: EntryPoints object has n…

【数据结构】实验七:字符串

实验七 字符串实验报告 一、实验目的与要求 1&#xff09;巩固对串的理解&#xff1b; 2&#xff09;掌握串的基本操作实现&#xff1b; 3&#xff09;掌握 BF 和 KMP 算法思想。 二、实验内容 1. 给定一个字符串ababcabcdabcde和一个子串abcd,查找字串是否在主串中出现。…

Oracle 多条记录根据某个字段获取相邻两条数据间的间隔天数,小于31天的记录都筛选出来

需求描述&#xff1a;在Oracle中 住院记录记录表为v_hospitalRecords&#xff0c;表中FIHDATE入院时间&#xff0c;FBIHID是住院号&#xff0c; 我想查询出每个患者在他们的所有住院记录中是否在一个月内再次入院(相邻的两条记录进行比较)&#xff0c;并且住院记录大于一的患者…

【高分论文密码】大尺度空间模拟预测与数字制图教程

详情点击链接&#xff1a;【高分论文密码】大尺度空间模拟预测与数字制图 一&#xff0c;R语言空间数据及数据挖掘关键技术 1、R语言空间数据及应用特点 1)R语言基础与数据科学 2)R空间矢量数据 3)R栅格数据 2、R语言空间数据挖掘关键技术 二&#xff0c;R语言空间数据高…

ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手&#xff0c;甚至是旅行指南。只要你知道如何让它做你想做的事&#xff0c;ChatGPT几乎可以提供你要的任何东西。 但重要的是&#xff0c;你知道哪个版本的ChatGPT最能满足你的需求吗&#x…

C++容器——list的模拟实现

目录 一.list的基本结构 二. 接下来就是对list类构造函数的设计了&#xff1a; 三.链表数据的增加&#xff1a; 四.接下来就是迭代器的创建了&#xff1a; 四.简单函数的实现&#xff1a; 五.构造与析构 六.拷贝构造和赋值重载 传统写法: 现代写法&#xff1a; 七.迭…

运维高级--shell脚本完成分库分表

为什么要进行分库分表 随着系统的运行&#xff0c;存储的数据量会越来越大&#xff0c;系统的访问的压力也会随之增大&#xff0c;如果一个库中的表数据超过了一定的数量&#xff0c;比如说MySQL中的表数据达到千万级别&#xff0c;就需要考虑进行分库分表&#xff1b; 其…

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

Paragon NTFS2023最新版Mac读写NTFS磁盘工具

Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具&#xff0c;可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区&#xff0c;因为在Mac OS X 系统上&#xff0c;默认状态下我们只能读取NTFS 分区&a…

【Ubuntu18.04免密码登录SSH】

Ubuntu18.04免密码登录SSH 1 查看Ubuntu18.04系统中是否存在SSH服务2 配置SSH2.1 先删除一下ssh的目录&#xff0c;重新配置2.2 生存公钥和私钥2.3 将公钥上传到需要登录的服务器2.4 测试登录 1 查看Ubuntu18.04系统中是否存在SSH服务 sudo ps -e |grep ssh没有的话&#xff0…

网络安全(黑客)自学基础到高阶路线

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

[JavaWeb]MySQL的安装与介绍

MySQL的安装与介绍 一.数据库相关概念1.1 数据库1.2 常见的关系型数据库管理系统 二.MySQL数据库1.MySQL的安装2.配置环境变量3.新建MySQL配置文件4.初始化MySQL5.注册MySQL的服务6.修改默认账户与密码7.连接MySQL服务8.MySQL的卸载 三.MySQL的数据模型1.关系型数据库 一.数据库…

Gitlab 备份与恢复

备份 1、备份数据&#xff08;手动备份&#xff09; gitlab-rake gitlab:backup:create2、备份数据&#xff08;定时任务备份&#xff09; [rootlocalhost ]# crontab -l 00 1 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create 说明&#xff1a;每天凌晨1点备份数据…

C++之lambda表达式/function/using/typedef用法总结(一百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

软件设计师学习第一章

计算机组成与体系结构&#xff08;6分&#xff09; 内容概述 数据的表示 进制转换 R 进制转十进制使用按权展开法&#xff0c;其具体操作方式为&#xff1a;将 R 进制数的每一位数值用 Rk 形示&#xff0c;即幂的底数是 R &#xff0c;指数为 k &#xff0c; k 与该位和小数点…

惠普HP Color Laser 150a开机红色感叹号闪烁不打印故障解决方法

故障描述&#xff1a; 惠普HP Color Laser 150a开机红色感叹号闪烁&#xff0c;不能打印&#xff0c;电脑提示C3-6140。 检测分析&#xff1a; 在解决C3-6140错误代码之前&#xff0c;我们需要先检查打印机是否连接正常。如果打印机连接不正常&#xff0c;也可能会出现这个错误…

2、HAproxy调度算法

HAProxy的调度算法可以大致分为以下几大类&#xff1a; 静态算法&#xff1a;这类算法的调度策略在配置时就已经确定&#xff0c;并且不会随着负载的变化而改变。常见的静态算法有&#xff1a; Round Robin(轮询) Least Connections(最少连接数) Static-Weight(静态权重) Sourc…