SpringBoot:SpringBoot配置文件.properties、.yml 和 .ymal(2)

news2024/11/16 11:35:19

SpringBoot配置文件

  • 1. 配置文件格式
    • 1.1 application.properties配置文件
    • 1.2 application.yml配置文件
    • 1.3 application.yaml配置文件
    • 1.4 三种配置文件优先级和区别
  • 2. yaml格式
    • 2.1 语法规则
    • 2.2 yaml书写
      • 2.2.1 字面量:单个的、不可拆分的值
      • 2.2.2 数组:一组按次序排列的值
      • 2.2.3 对象:键值对的集合
      • 2.2.4 复合结构
    • 2.3 ymal组织结构
  • 3. yaml配置文件数据读取
    • 3.1 使用功能@Value注解
    • 3.2 Enviroment对象
    • 3.3 自定义对象
  • 4. 多环境配置
    • 4.1 yml/yaml文件进行多环境配置
    • 4.2 properties文件进行多环境配置
    • 4.3 命令行启动参数设置
  • 5. 配置文件分类

1. 配置文件格式

我们启动服务器的默认端口是8080,我们怎样修改成自己设定的端口呐,比如设定为80端口,那么以后访问的时候就可以直接写:http://localhost/xxx,而不用写端口号了。SpringBoot已经为我们想到了,为我们提供了三种配置文件可以进行相关配置,分别为application.properties,application.yml,application.yaml。可以观察到三种配置文件都是以application.开头的,这是因为SpringBoot要求配置文件名字一定要为application.开头。下面我们一起了解一下吧。

1.1 application.properties配置文件

创建SpringBoot项目会在resources目录下自动创建一个application.properties配置文件,例如在配置文件中设置服务端口号为8089.
在这里插入图片描述

1.2 application.yml配置文件

注释掉application.properties配置文件中的端口设置,在resources目录下创建名为application.yml配置文件,在该文件中书写端口号的配置项,格式如下:

server:
  port: 8090

注意: 在:后,数据前一定要加空格。

在这里插入图片描述

1.3 application.yaml配置文件

注释掉application.yml配置文件中的端口设置,在resources目录下创建名为application.yaml配置文件,在该文件中书写端口号的配置项,格式如下:

server:
  port: 8091

注意: 在:后,数据前一定要加空格。

在这里插入图片描述

注意:如果创建的 application.ymlapplication.yaml 没有自动提示功能,可以参考下图把配置文件添加Configuration Files

在这里插入图片描述

1.4 三种配置文件优先级和区别

经过对上面三种配置文件的介绍,那么问题来了:

  1. 这三种配置文件优先级是怎样的呐???
  2. 这三种配置文件有什么区别吗???

针对第一个问题,我们可以做一个实验,在三个配置文件中配置不同的端口,启动服务器,查看显示的是哪一个端口,就可以确定那个配置文件的优先级高
application.properties: 8089
application.yml: 8090
application.yaml:8091

在这里插入图片描述

经实验证明:application.properties配置文件的优先级要高于application.ymlapplication.yaml

那么下面我们注释掉application.properties中的端口再次启动服务器进行查看。

在这里插入图片描述

经实验证明:application.yml 配置文件的优先级要高于 application.yaml

经上述实验证明三种配置文件的优先级为:application.properties > application.yml > application.yaml

针对问题2,则三种配置文件有什么区别呐???

区别1:定义和定位不同

properties 翻译成中文是“属性”的意思,所以它在创建之初,就是用来在 Spring Boot 中设置属性的。ymlYAML 是缩写,它的全称 Yet Another Markup Language,翻译成中文是“另一种标记语言”。所以从二者的定义可以看出:它们的定位和层次是完全不同的,properties 只是用来设置一些属性配置的,而 yml 的格局和愿景更大,它的定位是“另一种标记语言”,所以从格局上来讲 yml 就甩 properties 好几条街。

区别2:语法不同
propertiesyml 语法区别很大:
在这里插入图片描述

区别3:yml 更好的配置多种数据类型

yml 除了可以很好的配置基础数据类型之外,它还可以很方便的配置对象、集合等数据类型。

区别4:yml 可以跨语言

properties 格式的配置文件只适用于 Spring Boot 项目,也就是只适用于 Java 语言,而 yml 支持更多的开发语言,它可以用在 Java、PHP、Python、Ruby、JavaScript、Perl、Golang 等语言中。

2. yaml格式

YAML(YAML Ain't Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位

xml 格式如下:

<enterprise>
    <name>itcast</name>
    <age>16</age>
    <tel>4006184000</tel>
</enterprise>

properties 类型的配置文件如下

enterprise.name=itcast
enterprise.age=16
enterprise.tel=4006184000

yaml 类型的配置文件内容如下

enterprise:
	name: itcast
	age: 16
	tel: 4006184000

优点:

  • 容易阅读

    yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰

  • 容易与脚本语言交互

  • 以数据为核心,重数据轻格式

    yaml 更注重数据,而 xml 更注重格式

YAML 文件扩展名:

  • .yml (主流)
  • .yaml

上面两种后缀名都可以,目前比较流行的是 yml

2.1 语法规则

  • 大小写敏感

  • 属性层级关系使用多行描述,每行结尾使用冒号结束

  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)

    空格的个数并不重要,只要保证同层级的左侧对齐即可。

  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  • # 表示注释

核心规则:数据前面要加空格与冒号隔开

数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔。

2.2 yaml书写

2.2.1 字面量:单个的、不可拆分的值

字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。

YAML 中,使用“key:[空格]value”的形式表示一对键值对(空格不能省略),如 url: www.biancheng.net

字面量直接写在键值对的“value”中即可,且默认情况下字符串是不需要使用单引号或双引号的

name: bianchengbang

若字符串使用单引号,则会转义特殊字符。

name: 'zhangsan \n lisi'

输出结果为:

zhangsan \n lisi

若字符串使用双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义

name: "zhangsan \n lisi"

输出结果为:

zhangsan 
lisi

2.2.2 数组:一组按次序排列的值

YAML 使用“-”表示数组中的元素,特别注意“-”后面一定要跟着一个空格,普通写法如下:

    pets:
      - dog
      - cat
      - pig

行内写法:

pets: [dog,cat,pig]

2.2.3 对象:键值对的集合

YAML 中,对象可能包含多个属性,每一个属性都是一对键值对。

YAML 为对象提供了 2 种写法:

普通写法,使用缩进表示对象与属性的层级关系。

website: 
  name: bianchengbang
  url: www.biancheng.net

行内写法

website: {name: bianchengbang,url: www.biancheng.net}

2.2.4 复合结构

    person:
      name: zhangsan
      age: 30
      pets:  # 数组
        - dog
        - cat
        - pig
      car:  # car对象
        name: QQ
      child: # child对象
        name: zhangxiaosan
        age: 2

2.3 ymal组织结构

一个 YAML 文件可以由一个或多个文档组成,文档之间使用“---”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“---”分隔符可以省略。

    ---
    website:
      name: bianchengbang
      url: www.biancheng.net
    ---
    website: {name: bianchengbang,url: www.biancheng.net}
    pets:
      -dog
      -cat
      -pig
    ---
    pets: [dog,cat,pig]
    name: "zhangsan \n lisi"
    ---
    name: 'zhangsan \n lisi'

3. yaml配置文件数据读取

环境准备:
在这里插入图片描述

3.1 使用功能@Value注解

使用 @Value("表达式") 注解可以从配置文件中读取数据,注解中用于读取属性名引用方式是:${一级属性名.二级属性名……}

可以在 BookController 中使用 @Value 注解读取配合文件数据,如下:

@RestController
@RequestMapping("/books")
public class BookController {
    // 读取yaml中的内容方式一
    @Value("${lesson}")
    private String lesson;
    @Value("${enterprise.name}")
    private String name;
    @Value("${enterprise.age}")
    private String age;
    @Value("${enterprise.tel}")
    private String tel;
    @Value("${enterprise.subject[0]}")
    private String subject_0;

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("================ 方式一 ================");
        System.out.println("id ===> " + id);
        System.out.println("lesson ==> " + lesson);
        System.out.println("name ==> " + name);
        System.out.println("age ==> " + age);
        System.out.println("tel ==> " + tel);
        System.out.println("subject[0] ==> " + subject_0);
        return " hello springboot3";
    }
}

在这里插入图片描述

3.2 Enviroment对象

使用Environment对象,SpringBoot 会将配置文件中所有的数据封装到 Environment 对象中。如果需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取。

@RestController
@RequestMapping("/books")
public class BookController {
    // 使用 `Environment` 对象的方式读取数据。
    //  `SpringBoot` 会将yaml配置文件中所有的数据封装到 `Environment` 对象中,
    // 如果需要使用哪个数据只需要通过调用 `Environment` 对象的 `getProperty(String name)` 方法获取。
    @Autowired
    private Environment environment;

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("================ 方式二 ================");
        System.out.println("lesson ==> " + environment.getProperty("lesson"));
        System.out.println("name ==> " + environment.getProperty("enterprise.name"));
        System.out.println("age ==> " + environment.getProperty("enterprise.age"));
        System.out.println("tel ==> " + environment.getProperty("enterprise.tel"));
        System.out.println("subject_0 ==> " + environment.getProperty("enterprise.subject[2]"));
        return " hello springboot3";
    }
}

在这里插入图片描述

3.3 自定义对象

SpringBoot 提供了将配置文件中的数据封装到自己定义的实体类对象中的方式。具体操作如下:

  • 将实体类 bean 的创建交给 Spring 管理。

    在类上添加 @Component 注解

  • 使用 @ConfigurationProperties 注解表示加载配置文件,在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据

  • BookController 中进行注入

@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
    private String name;
    private String tel;
    private Integer age;
    private String[] subject;
// get/set方法,构造方法,toString方法。。。。

BookController的内容:

@RestController
@RequestMapping("/books")
public class BookController {
    // 创建enterprise对应的实体类,将配置文件中的数据封装到我们自定义的实体类对象中的方式,方式三
    @Autowired
    private Enterprise enterprise;



    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("================ 方式三 ================");
        System.out.println("name ==> " + enterprise.getName());
        System.out.println("age ==> " + enterprise.getAge());
        System.out.println("tel ==> " + enterprise.getTel());
        System.out.println("subject ==> "  + enterprise.getSubject()[1]);
        return " hello springboot3";
    }
}

在这里插入图片描述

4. 多环境配置

目前,我们都是在自己的电脑上进行开发,但是开发完之后还要交给测试环境和生成环境。这些配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要修改配置,将环境的配置改为线上环境的。

在这里插入图片描述

来回的修改配置会很麻烦,对于这个问题, SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同。

4.1 yml/yaml文件进行多环境配置

yml/yaml中进行配置

# 设置启用的环境
spring:
  profiles:
    active:  dev  # 表示使用的是开发环境的配置


# 使用 “---” 区分不同的配置
---
# 开发环境
server:
  port: 8080
spring:
  profiles: dev
---
# 生产环境
server:
  port: 8181
spring:
  profiles: pro
---
# 测试环境
server:
  port: 8082
spring:
  profiles: test

注意:

在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。最新用来起名字的配置项是

#开发
spring:
  config:
    activate:
      on-profile: dev

测试开发环境

在这里插入图片描述

测试生产环境

在这里插入图片描述

测试测试环境

在这里插入图片描述

4.2 properties文件进行多环境配置

properties 类型的配置文件配置多环境需要定义不同的配置文件

  • application-dev.properties 是开发环境的配置文件。我们在该文件中配置端口号为 80

    server.port=8080
    
  • application-test.properties 是测试环境的配置文件。我们在该文件中配置端口号为 81

    server.port=8081
    
  • application-pro.properties 是生产环境的配置文件。我们在该文件中配置端口号为 82

    server.port=8082
    

在这里插入图片描述

SpringBoot 只会默认加载名为 application.properties 的配置文件,所以需要在 application.properties 配置文件中设置启用哪个配置文件,配置如下:

spring.profiles.active=dev  # 启用开发环境
# spring.profiles.active=pro  # 启用生产环境
# spring.profiles.active=test # 启用测试环境

4.3 命令行启动参数设置

使用 SpringBoot 开发的程序都是打成 jar 包,通过 java -jar xxx.jar 的方式启动服务的。那么问题来了,如何切换环境呢?因为配置文件打到的jar包中了。

我们知道 jar 包其实就是一个压缩包,可以解压缩,然后修改配置,最后再打成jar包就可以了。这种方式显然有点麻烦,而 SpringBoot 提供了在运行 jar 时设置开启指定的环境的方式,如下

java –jar xxx.jar –-spring.profiles.active=test

那么这种方式能不能临时修改端口号呢?也是可以的,可以通过如下方式

java –jar xxx.jar –-server.port=88

当然也可以同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口,如下

java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test

原始配置:开发环境dev、测试端口8080

在这里插入图片描述

利用--server.port指令修改端口为8089

在这里插入图片描述

利用--spring.profiles.active指令切换配置环境

在这里插入图片描述

--server.port--spring.profiles.active 结合使用

在这里插入图片描述

大家进行测试后就会发现命令行设置的端口号优先级高(也就是使用的是命令行设置的端口号),配置的优先级其实 SpringBoot 官网已经进行了说明,参见 :https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

5. 配置文件分类

问题提出:有这样的场景,我们开发完毕后需要交给测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置,如下

java –jar springboot.jar –-spring.profiles.active=test --server.port=85 --server.servlet.context-path=/heima --server.tomcat.connection-timeout=-1 …… …… …… …… ……

针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。

SpringBoot 中4级配置文件放置位置:

  • 1级:classpath:application.yml
  • 2级:classpath:config/application.yml
  • 3级:file :application.yml
  • 4级:file :config/application.yml

说明: 级别越高优先级越高
SpringBoot项目中的配置文件是分级的,可以分为1,2,3,4级

第1级就是resources下面的配置文件: application.yml

第2级是在resources/config目录下的配置文件:application.yml, 启动项目发现用的端口号为8081,说明此配置文件的优先级较高。

在这里插入图片描述

第3级是SpringBoot项目package后,在目录下面创建的application.yml配置文件

在这里插入图片描述

Dos窗口中启动项目,发现项目端口号为8082,说明此配置文件的优先级要高于前两个配置文件的优先级。

在这里插入图片描述

第4级是SpringBoot项目package后,在目录下面创建的config/application.yml配置文件

在这里插入图片描述

Dos窗口中启动项目,发现项目端口号为8083,说明此配置文件的优先级要高于前三个配置文件的优先级。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统权限提升(十八)之Linux提权-内核提权

Linux 内核提权 Linux 内核提权原理 内核提权是利用Linux内核的漏洞进行提权的&#xff0c;内核漏洞进行提权一般包括三个环节&#xff1a; 1、对目标系统进行信息收集&#xff0c;获取到系统内核信息及版本信息&#xff1b; 2、根据内核版本获取其对应的漏洞以及EXP 3、使…

第七届蓝桥杯省赛 C++ A/B组 - 四平方和

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;四平方和 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…

Docker简介与用法

文章目录1、Docker简介1.1、Docker能解决什么问题1.2、什么是虚拟机技术1.2.1、虚拟机的缺点1.3、什么是容器1.3.1、容器与虚拟机比较1.4、分析 Docker 容器架构1.4.1、Docker客户端和服务器1.4.2、Docker 镜像(Image)1.4.3、Docker 容器(Container)1.4.4、Docker 仓库(reposit…

Windows程序员学习Linux环境内存管理

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后&#xff0c;还要部署到Linux服务器上去&#xff0c;所以作为Windows程序员有必要学习Linux环境的内存…

【计算机三级网络技术】 第三篇 IP地址规划技术

IP地址规划技术 文章目录IP地址规划技术一、IP 地址规划以及划分地址新技术1.IP地址的标准分类&#xff08;第一阶段&#xff09;2.划分子网的三级地址结构(第二阶段)3.构成超网的无类域间路由技术(第三阶段)4.网络地址转换技术(第四阶段)二、IP 地址分类1.A类、B类与C类IP地址…

数据的表示和运算

文章目录数制与编码进制间的转换BCD码定点数与浮点数定点数是什么&#xff1f;浮点数是什么&#xff1f;定点数与浮点数的区别机器数和真值原码、反码、补码、移码基本定义整数的加减法刷题小结最后数制与编码 进制间的转换 二进制、八进制、十进制、十六进制之间的转换不用多…

前端杂学1

1.简单且必须掌握的 1.MVVM是什么 将MVC中的V变为了MVVM&#xff0c;实现了双向绑定。其中VM就是vue的作用&#xff0c;这样页面的动态化可以通过vue来操作&#xff0c;而不是页面直接与后端操作&#xff0c;实现了前后端的分离 2.为什么vue采用异步渲染 &#xff1f; 调…

Kubernetes之服务发现

本文使用wordpressmysql搭建个人博客来讲解服务发现相关知识。 环境准备 wordpress需要连接到mysql才能正常工作&#xff0c;所以需要为mysql的pod创建一个mysql的svc&#xff0c;只要不删除重建svc&#xff0c;其IP不会变。 此时wordpress的pod需要连接mysql的svc的时候&…

HyperGBM用4记组合拳提升AutoML模型泛化能力

本文作者&#xff1a;杨健&#xff0c;九章云极 DataCanvas 主任架构师 如何有效提高模型的泛化能力&#xff0c;始终是机器学习领域的重要课题。经过大量的实践证明比较有效的方式包括&#xff1a; 利用Early Stopping防止过拟合通过正则化降低模型的复杂度使用更多的训练数…

第四阶段01-酷鲨商城项目准备

1. 关于csmall-product项目 这是“酷鲨商城”大项目中的“商品管理”项目&#xff0c;是一个后台管理项目&#xff08;给管理员&#xff0c;或运营人员使用的项目&#xff0c;并不是普通用户使用的&#xff09;&#xff0c;并且&#xff0c;只会涉及与发布商品可能相关的功能开…

企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

React(二):jsx事件绑定、条件渲染、列表渲染、jsx的本质、购物车案例

React&#xff08;二&#xff09;一、jsx事件绑定1.this的绑定方式2.jsx中绑定this的三种方式3.事件对象和传参&#xff08;1&#xff09;事件对象怎么传&#xff08;2&#xff09;其他参数怎么传&#xff1f;二、条件渲染1.直接if-else2.三元表达式3.利用逻辑中断4.案例练习5.…

HTML#5表单标签

一. 表单标签介绍表单: 在网页中主要负责数据采集功能,使用<form>标签定义表单表单项: 不同类型的input元素, 下拉列表, 文本域<form> 定义表单<input> 定义表单项,通过typr属性控制输入形式<label> 为表单项定义标注<select> 定义下拉列表<o…

【GO】31.grpc 客户端负载均衡源码分析

这篇文章是记录自己查看客户端grpc负载均衡源码的过程&#xff0c;并没有太详细的讲解&#xff0c;参考价值不大&#xff0c;可以直接跳过&#xff0c;主要给自己看的。一.主要接口&#xff1a;Balancer Resolver1.Balancer定义Resolver定义具体位置为1.grpc源码对解析器(resol…

异步通知实验

目录 一、异步通知简介 阻塞、非阻塞、异步通知区别 信号与信号修改测试 测试 二、驱动编写 1、定义fasync_struct 结构体指针变量 2、操作集添加fasync 3、实现imx6uirq_fasync 函数 4、关闭驱动文件操作 ​编辑 5、定时器处理函数 三、编写APP 1、编写信号的处理…

ElasticSearch 学习笔记总结(二)

文章目录一、ES JavaAPI 环境准备二、ES JavaAPI 索引1. 索引 创建2. 索引 查找3. 索引 删除三、ES JavaAPI 文档1. 文档 创建2. 文档 修改3. 文档 查询4. 文档 删除4. 文档 批量新增 和 批量删除5. 高级查询 索引全量查询6. 高级查询四、ES 集群1. ES集群 概念2. window 集群搭…

阿里P8:做测试10年我的一些经验分享,希望你们少走弯路

我是在2015年毕业的&#xff0c;当时是读的普通本科&#xff0c;不上不下的专业水平&#xff0c;毕业的时候&#xff0c;恰好遇到了金融危机。校园招聘里阴差阳错的巧合&#xff0c;让我走上了软件测试工程师的道路。 入职第一天&#xff0c;来了个高大上的讲师&#xff0c;记…

如何使用码匠连接 PostgreSQL

目录 在码匠中集成 PostgreSQL 在码匠中使用 PostgreSQL 关于码匠 PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;它具有许多强大的功能&#xff0c;PostgreSQL 支持大部分的 SQL 标准并且提供了很多其他现…

一些无线通信系统模型的概念

一些无线通信系统模型的概念 扩频通信,指的是系统的带宽WWW远大于其信息传输速率R(bits/s)R(bits/s)R(bits/s), 定义展频带因子BeWRB_e \frac{W}{R}Be​RW​, 易知在扩频通信系统中,BeB_eBe​远大于1. 在频率上产生如此大的冗余度,主要是为了减轻无线通信或卫星通信中经常产生…

关于算法学习和刷题的建议

大家好&#xff0c;我是方圆。最近花时间学了学算法&#xff0c;应该算是我接触Java以来第一次真正的学习它&#xff0c;这篇帖子我会说一些我对算法学习的理解&#xff0c;当然这仅仅是浅浅的入算法的门&#xff0c;如果想深挖或者是有基础的人想提升自己&#xff0c;我觉得这…