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=falseusername: rootpassword: rootdriver-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=utf8username: rootpassword: 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 Chenshukey2: '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: 1name: zhangsanage: 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;}@Overridepublic 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.ageValue: "20"Origin: class path resource [application.yml] - 15:36Reason: 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: 8001spring:datasource:url: jdbc:mysql://127.0.0.1:3306/dev?characterEncoding=utf8username: rootpassword: root

application-test.yml:

# 测试环境的配置文件
server:port: 8002spring:datasource:url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8username: rootpassword: root

application-prod.yml:

# 生产环境的配置文件
server:port: 8003spring:datasource:url: jdbc:mysql://127.0.0.1:3306/prod?characterEncoding=utf8username: rootpassword: root

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

application.yml:

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

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

image.png

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技助力输电线安全隐患预警,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建电力设备场景下输电线安全隐患目标检测预警系统

电力的普及让我们的生活变得更加便利,四通八达的电网连接着生活的方方面面,电力能源主要是依托于庞大复杂的电网电力设备进行传输的,有效地保障电网场景下输电线的安全对于保障我们日常生活所需要的电力有着重要的意义,但是电力设…

宝塔面板Docker+Uwsgi+Nginx+SSL部署Django项目

这次为大家带来的是从零开始搭建一个django项目并将它部署到linux服务器上。大家可以按照我的步骤一步步操作,最终可以完成部署。 步骤1:在某个文件夹中创建一个django项目 安装django pip install django创建一个django项目将其命名为djangoProject …

再写-全景拼接

全景拼接 1. 将读取进行灰度转化,并且输出图像,关键点和计算描述 import cv2 import numpy as np# 将读取进行灰度转化,并且输出图像,关键点和计算描述 image_left cv2.imread("C:\\Users\\HONOR\\Desktop\\image\\pinjie…

微信登录功能-保姆级教学

目录 一、使用组件 二、登录功能 2.1 步骤 2.2 首先找到网页权限 复制demo 代码 这里我们需要修改两个参数 三、前端代码 3.1 api 里weiXinApi.ts 3.2 api里的 index.ts 3.3 pinia.ts 3.4 My.vue 四、后端代码 4.1 WeiXinController 4.2 Access_Token.Java 4.3 We…

1027: 舞伴问题

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int main() {int n, m, k;cin >> n;vector<char> man(n);for (int i 0; i < n; i) cin >> man[i];cin >> m;vector<char> woman(m);for (int i 0…

实现 .NET 8 部署到 Docker

一、前言 本文仅针对操作系统为 CentOS 8 的环境下部署方法进行讲述。如有需要,后续将在其他文章中进行其他系统下的部署方式讲解。 二、准备工作 确保服务器已安装 docker。 可以通过命令 docker -v 进行检查,如出现下图结果则表示已安装。 代码准备 在代码项目名称上右键…

设计模式学习笔记 - 设计模式与范式 -行为型:17.中介模式:什么时候用中介模式?什么时候用观察者模式?

概述 本章学习 23 种经典设计模式中的最后一个设计模式&#xff0c;中介模式。和之前讲过的命令模式、解释器模式类似&#xff0c;中介模式也不怎么常用&#xff0c;应用场景比较特殊、有限&#xff0c;但是&#xff0c;跟它俩不同的是&#xff0c;中介模式理解起来并不难&…

Python程序设计 二维列表

教学案例九 二维列表 1. 成绩文件的读取 score.csv文件中记录了多门同学的编号、姓名和三门功课的成绩(逗号键分隔) 格式如下 编写程序&#xff0c;将文件score.csv文件中的数据放入二维列表cjlb中(注意&#xff1a;语文、数学、英语成绩要转换为数值类型) f1open("lbk…

PyQt5

Qt是基于C实现的GUI,而PyQt就是用python调用Qt. PyQt中有很多的功能模块,开发最常用的模块功能主要有3个 1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用 2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类 3)…

【Web】DASCTF2022.07赋能赛 题解

目录 Ez to getflag Harddisk 绝对防御 Newser Ez to getflag 进来有两个功能&#xff0c;一个查看&#xff0c;一个上传 图片查看功能可以任意文件读 upload.php <?phperror_reporting(0);session_start();require_once(class.php);$upload new Upload();$upload…

Spring ORM

Spring Data JPA 作为Spring Data 中对于关系型数据库支持的一种框架技术,属于 ORM 的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度。 Java里面写的一段DB操作逻辑,是如何一步步被传递到 DB 中执行了的呢?为什么 Java 里面可以去对接不同产商的 DB 产…

架构师系列-搜索引擎ElasticSearch(六)- 映射

映射配置 在创建索引时&#xff0c;可以预先定义字段的类型&#xff08;映射类型&#xff09;及相关属性。 数据库建表的时候&#xff0c;我们DDL依据一般都会指定每个字段的存储类型&#xff0c;例如&#xff1a;varchar、int、datetime等&#xff0c;目的很明确&#xff0c;就…