8. Spring Boot 配置文件

源码地址:SpringBoot_demo

本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下

1. 配置文件是什么

上节说到,Spring Boot的项目分为三个部分:源代码目录、资源目录、单元测试目录。

而配置文件的位置就位于资源目录resources的第一级,名为application.properties,可见配置文件于Spring Boot项目的重要性:

在这里插入图片描述

上一篇文章提到了Spring Boot约定大于配置的思想,这里就能够体现:它的命名只能是application.xxx

2. 配置文件的作用

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

  • 项目的启动端口:过去所有项目都是在一个本地Tomcat的配置文件中所配置的端口号,通过Context Path区分项目,如今由于内置的Tomcat,只要通过配置文件的配置就可以设定项目的启动端口号;
  • 数据库的连接信息(包含用户名和密码的设置):过去要以代码的形式连接数据库,在Spring Boot时代只要简单的几句配置语句就可以完成;
  • 日志信息配置:如日志持久化等

3. 配置文件的两种格式

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

  • .properties
  • .yml

3.1 语法差别

以配置项目的启动端口号为例:

(1) properties语法

它的语法特别简单,也就是"键"=“值”

server.port=8080

观察一下它的键"server.port",类似于java中导包时用来区分不同的包下的类(把server看成包,把port看作类)


(2) yml语法

该格式可以说是properties格式的升级,yml格式则是更改了键的形式,键的级别之间用':' + '\n' + '\t'分割,值和键之间必须用':' + '空格'分割

server:
  port: 8081

3.2 读取顺序

两种格式的配置文件可以共存在一个项目中,当一个项目有两种格式的配置文件的时候,会先去读取application.properties文件,再去读取application.yml文件,前者的优先级最高。也就是说两个文件中都配置了"server.port"这一个键的话,那么会以.properties中的配置为主

server.port=8888
server:
  port: 9999

image.png

但是实际开发中通常会使用统一的配置文件格式,这样可以更方便的维护。

4. application.properties编码问题

4.1 问题描述

在application.properties和application.yml中都可以通过'#'来写注解:

# 设置端口号
server.port=8888

但是在application.properties默认是以ISO-8859-1来编码的,而idea默认是以utf-8来解码的,有中文的情况下,如果关闭了项目下次再打开就会变成乱码:

image.png

关闭idea,并重新打开该项目:

image.png

4.2 解决方案

1、关闭项目

image.png

2、更改所有设置

在这里插入图片描述

3、更改.properties的编码方式

在这里插入图片描述

4、点击Apply+OK,这样设置完之后的项目的properties文件就都是以utf-8来编码的了,当前项目的话还需自己手动打开当前项目的设置,其他步骤和上述一样:

image.png

5. 常用配置内容

这里使用yaml的格式,简单看看,后续都会用到:

# 配置启动端口号
server:
  port: 9999
# 配置数据库的连接字符串
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/blog_system?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
# 配置日志输出信息
logging:
  level:
    com:
      example:
        demo: debug

更多配置点这:Spring Boot 各种配置项

6. 读取配置文件的信息

配置文件内容分类:

  1. Spring Boot 内置的配置项目,比如server.port
  2. 用户自定义的配置项

我们可以自行定义配置项(下面用properties来定义,yml同理):

# 用户自定义配置项
mykey.key1=chenshu

读取配置文件中的值:

想要读取配置文件中的值,需要在类的字段上添加一个@Value注解,@Value注解中的参数必须要使用${}将键包裹起来,如读取键为mykey.key1的值就这样写:@Value("${mykey.key1}")

@RestController
public class TestController {
    //读取配置文件中的值
    @Value("${mykey.key1}")
    private String myKey;

    //配置路由
    @RequestMapping("/getkey")
    public String getMyKey() {
        return myKey;
    }
}

浏览器中搜索该方法的路由:

image.png

7. yml 配置文件说明

yml是YAML的缩写,全称为Yet Another Markup Language(另一种标记语言)

在开发中更推荐使用yml,举个例子:

application.properties有下面配置:

# 数据库的连接配置
# 数据库的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/druid_test?characterEncoding=utf8
# 数据库username
spring.datasource.username=root
#数据库password
spring.datasource.password=root

application.yml中是下面这样:

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

7.1 优点分析

  1. yml消除更多冗余信息,properties每次都要重新写spring.datasource
  2. yml能更直观的区分配置文件的层级结构
  3. yml 支持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
  4. yml支持更多的编程语言,它不止是Java 中可以使用在 Golang、PHP、Python、Ruby、JavaScript、Perl中。

7.2 yml字符串修饰符问题

  • 当不使用任何字符串修饰符的情况下,会将原生的值赋值给变量
  • 当使用单引号来修饰的情况下,会将原生的值赋值给变量
  • 当使用双引号来修饰的情况下,那么value值中的特殊字符就会发挥自身的用途,比如"\n"就会实现换行的效果

配置文件:

mykey:
  key1: I am \n Chenshu
  key2: 'I am \n Chenshu'
  key3: "I am \n Chenshu"

测试代码:

@RestController
public class TestController {

    @Value("${mykey.key1}")
    private String myKey1;

    @Value("${mykey.key2}")
    private String myKey2;

    @Value("${mykey.key3}")
    private String myKey3;

    //配置路由
    @RequestMapping("/getkey")
    public void getMyKey() {
        System.out.println(myKey1);
        System.out.println(myKey2);
        System.out.println(myKey3);
    }
}

输出结果:

I am \n Chenshu
I am \n Chenshu
I am 
 Chenshu

7.3 通过yml配置对象属性

yml配置对象属性支持两种写法:

原始写法:

User:
  id: 1
  name: zhangsan
  age: 20

行内写法:

User: {id: 1, name: zhangsan, age: 20}
  1. 编写一个model类:
public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}
  1. 在model上添加注解:
    在添加@Component的基础上,还要添加@ConfigurationProperties(prefix = "user")
@Component
@ConfigurationProperties(prefix = "user")
public class User {
  1. TestController中注入依赖:
@Autowired
private User user;
  1. 编写路由方法,返回配置文件中获取的对象的值:
@RequestMapping("/getuser")
public String getUser() {
    return "Hi, " + user;
}
  1. 访问对应路由:

image.png

注意事项:

  1. @ConfigurationProperties(prefix = "user"),表示从配置文件中读取键为"user"的对象,将对象中的字段赋值给Bean,其实就跟传统的Spring中的通过配置文件的setter属性注入是一样的,该注解必须要有setter方法,通过setter方法注入值,否则会报错,把setAge()屏蔽后启动项目会失败:
  2. 必须绑定五大类注解使用,因为 @ConfigurationProperties(prefix = "user")的作用只是赋值,setter()方法使用的前提是有这个对象。
Property: user.age
    Value: "20"
    Origin: class path resource [application.yml] - 15:36
    Reason: java.lang.IllegalStateException: No setter found for property: age

7.4 通过yml配置集合

7.3讲到的配置对象属性只能配置基本类型,如int,String等,其实配置集合也是配置对象属性的一种,不过属性由基本类型变成了list集合,yml配置list集合同样支持两种写法:

原始写法:

dbtypes:
  name:
    - mysql
    - sqlserver
    - sqlite

行内写法:

dbtypes: {name: [mysql,sqlserver,sqlite]}
  1. 编写一个model类(这次我们直接加上来自Lombok的@Data注解,作用是省去了编写setter、getter以及toString方法):
@Data
public class DBTypes {
    private List name;
}
  1. 在model上添加注解:
    在添加@Component的基础上,还要添加@ConfigurationProperties(prefix = "dbtypes")
@Data
@Component
@ConfigurationProperties(prefix = "dbtypes")
public class DBTypes {
    private List name;
}
  1. TestController中注入依赖:
@Autowired
private DBTypes dbTypes;
  1. 编写路由方法,返回配置文件中获取的对象的值:
@RequestMapping("/getdb")
public String getDBTypes() {
    return "Hi, " + dbTypes;
}
  1. 访问对应路由:

image.png

8. 多环境的配置文件设置

在实际开发中涉及到多环境的开发,如:

  • 开发环境的配置文件
  • 测试环境的配置文件
  • 生产环境的配置文件

而不同环境需要使用不同的配置文件设置(如不同的环境需要连接不同的数据库),通过多环境的配置文件设置,就不用再通过单一的配置文件改来改去了。

Spring Boot的约定大于配置,它们的命名也是有约定的,命名方式为:application-xxx.yml(其中只有xxx是可以修改的)

我在resources目录下新增了这三个配置文件,分别代表三种开发环境:

  • 开发环境:application-dev.yml
  • 测试环境:application-test.yml
  • 生产环境:application-prod.yml

image.png

这里我们把application.properties文件给忽视掉,resources目录下只有四个配置文件,此时application.yml是主配置文件

我在三种环境的配置文件中分别设置了启动端口为:8001、8002、8003,并且连接了不同的数据库:

application-dev.yml:

# 开发环境的配置文件
server:
  port: 8001

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

application-test.yml:

# 测试环境的配置文件
server:
  port: 8002

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

application-prod.yml:

# 生产环境的配置文件
server:
  port: 8003

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

然后在主配置环境中设置运行环境为开发环境,这样Spring Boot项目在读配置文件的时候会读取主配置文件+设置的运行环境的配置文件的内容:

application.yml:

# 运行环境设置
spring:
  profiles:
    active: dev

发现确实是以application-dev.yml的配置文件中设置的启动端口号启动项目:

image.png

总结:在实际开发中可以把公共的配置写在主配置文件application.yml中,不同开发环境下需要不同的设置再分别写入application-xxx.yml中,并且在主配置文件中设置相应的运行环境,以实现多环境的配置文件设置。

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

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

相关文章

Python-VBA函数之旅-delattr函数

目录 1、 delattr函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 delattr函数在Python中具有广泛的应用场景,主要用于动态地管理对象的属性。常用…

Python十大最佳实践:高效Python编程的十个关键方法

在当今的软件开发世界中,Python是一种极其重要且广泛使用的编程语言。以下是Python编程的十大最佳实践,这些实践将帮助你提升编程效率,优化代码质量,以及更好地应用Python的强大功能。 1.理解Pythonic的方式 “Pythonic”是指遵循…

傲基科技冲刺上市:依赖单一产品,元气未恢复,有股东提前退出

近日,傲基科技股份有限公司(下称“傲基科技”)递交招股书,准备在港交所主板上市,华泰证券为其独家保荐人。 据招股书介绍,傲基科技是一家提供家具家居类产品的品牌运营商及出口物流服务商。傲基科技在招股…

Java+vue2+springboot智慧班牌系统源码,支持PC端、移动客户端、电子班牌端,SaaS模式部署

智慧班牌作为一个班级的标识,也是班级空间日常管理的载体,作为班级文化展示交流窗口与学科教学、德育管理,以及学校信息収布等有机结合起来,作为学生展示的平台,又可应用于普及教育安全知识和科学文化,拓展…

Python爬虫:requests模块的基本使用

学习目标: 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景:防止恶意IP尝试ssh登录 脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。 分析: 首先,需要知道ssh远程访问记录在哪一个文件中 /var/log/secure 其次,模拟远程访问输错密码,查…

2024 十五届蓝桥杯省赛Python B组

以下仅是我的答案,仅供参考,欢迎讨论。 A:穿越时空之门 二进制、四进制转换。答案:63。 B:数字串个数 排除0,总的方案数9^10000,减去不存在3和不存在7的2*8^10000,再加上同时不存在3和7的7^…

MYSQL09_行格式概述、变长字段、NULL值、记录头信息、真实数据、内部结构

文章目录 ①. InnoDB - 行格式概述②. 变长字段长度列表 ③. NULL值列表④. 记录头信息5字节⑤. 记录的真实数据⑥. Compact行记录的内部结构⑦. Dynamic和Compressed行格式 ①. InnoDB - 行格式概述 ①. 我们平时的数据以行为单位来向表中插入数据,这些记录在磁盘上的存放方式…

【C语言基础】:编译和链接(计算机中的翻译官)

文章目录 一、翻译环境和运行环境1. 翻译环境1.1 编译1.1.1 预处理1.1.2 编译1.1.3 汇编 1.2 链接 2. 运行环境 一、翻译环境和运行环境 我们在Visual Studio上写的C语言代码其实都是一些文本信息,计算机是不能够直接执行他们的,计算机只能够执行二进制…

基于Linux定时任务实现的MySQL周期性备份

1、创建备份目录 sudo mkdir -p /var/backups/mysql/database_name2、创建备份脚本 sudo touch /var/backups/mysql/mysqldump.sh# 用VIM编辑脚本文件,写入备份命令 sudo vim /var/backups/mysql/mysqldump.sh# 内如如下 #!/bin/bash mysqldump -uroot --single-…

下载好了annaconda,但是在创建一个新的Conda虚拟环境报错

文章目录 问题描述:解决方案1.生成一个配置文件 问题总结 问题描述: ProxyError(MaxRetryError(“HTTPSConnectionPool(host‘repo.anaconda.com’, port443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by ProxyErr…

系统架构最佳实践 -- 金融企业的资损防控

一、资损产生的原因 由于支付行业的特殊性与复杂性(主要处理资金相关业务),支付公司处于资损的风口浪尖,最容易发生资损,可以说资损风险无处不在。 常规来说,资损原因主要可以分为以下三类: 1…

【鸿蒙开发】第二十章 Camera相机服务

1 简介 开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。 2 …

浮点数的表示

王道考研ppt总结: 二、个人理解 浮点数解决的是定点数的位数局限,导致表示范围有限的问题 阶码:由阶符和数值部分组成,阶符为,小数点向左移动,否则向右移动;数值部分,是底数的几次幂…

【新版】系统架构设计师 - 知识点 - 面向对象开发方法

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 知识点 - 面向对象开发方法面向对象开发方法面向对象的分析需求模型分析模型 面向对象的设计 用例模型关系、UML事务关系、类的关系 架构 - 知识点 - 面向对象开发方法 面向对象开发方法 分析阶段…

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富,包括主流标准协议,有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海…

面试算法-164-K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

MySQL事务与事务原理

目录 事务 事务的四大特性ACID 事务隔离级别 事务原理 存储引擎 四大特性的保证 MVCC 事务链 ReadView 事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 start transaction; -- 开启事务 或者 b…

【CDN(Content Delivery Network)】

文章目录 CDN(Content Delivery Network)视频流化服务和CDN:上下文多媒体: 视频存储视频的流化服务:多媒体流化服务:DASH流式多媒体技术3: DASH CDN(Content Delivery Network) 视频流化服务和…

kafka学习记录

文章目录 windows单机版kafka搭建步骤主题的增删改查操作消息的生产与消费 Windows集群版kafka搭建步骤 prettyZoo 尚硅谷Kafka教程,2024新版kafka视频,零基础入门到实战 【尚硅谷】Kafka3.x教程(从入门到调优,深入全面&#xff0…