上次说完SpringBoot项目搭建的流程和原理,这节写一下SpringBoot的配置文件的相关知识。

1.配置文件类型和作用

SpringBoot的设计思路就是约定大于配置,很多配置都是设定好的,不用我们再去设置,但是某些参数还是需要我们自己设定,这个时候就要用到SpringBoot的配置文件了,有两种常用的配置文件(在Resources目录下):
application.properties或者application.yml(application.yaml),可以在里面按照它们的语法规则设定我们想要配置的参数。
在SpringBoot 启动时,会从Resources目录下加载application.properties或application.yml(application.yaml)文件。

application.properties文件是键值对类型的文件,通过.来连接,通过=来赋值,结构上,没有分层的感觉,但比较直接。

spring.datasource.name=springbootdemo
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdemo
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

可以看到properties类型的文件重复的部分较多,层次感不明显,不易于阅读。

YAML是一种直观的能够被电脑识别的的数据序列化格式,它的后缀名可以是ymal、yml,通过:来分层,结构上,有比较明显的层次感,容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导
入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简
洁。注意,赋值时“:”后需要留一个空格,否则这条参数不生效。

spring:datasource:name: springbootdemourl: jdbc:mysql://localhost:3306/springbootdemousername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver

yml格式的文件结构就清晰多了。

**properties和yml的优先级:**如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件。所以建议工程中,只使用其中一种类型的文件即可。

上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档
文档URL:https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-applicationproperties
常用的配置摘抄如下:

...
server.port=8080 # Server HTTP port.
server.server-header= # Value to use for the Server response header (if empty, no header is sent).
server.use-forward-headers= # Whether X-Forwarded-* headers should be applied to the HttpRequest.
server.servlet.context-parameters.*= # Servlet context init parameters.
server.servlet.context-path= # Context path of the application.
server.servlet.application-display-name=application # Display name of the application.
server.servlet.jsp.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet.
server.servlet.jsp.init-parameters.*= # Init parameters used to configure the JSP servlet.
server.servlet.jsp.registered=true # Whether the JSP servlet is registered.
server.servlet.path=/ # Path of the main dispatcher servlet.
server.servlet.session.cookie.comment= # Comment for the session cookie.
server.servlet.session.cookie.domain= # Domain for the session cookie.
server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie.
server.servlet.session.cookie.max-age= # Maximum age of the session cookie. If a duration suffix is not specified, seconds will be used.
server.servlet.session.cookie.name= # Session cookie name.
...

2.配置文件扫描优先级

在实际生产中,配置文件的放置位置是可以选择的,不同的位置被读取的优先级也是不同的。

从上到下4个配置文件分别设置的访问端口为8080、8081、8082、8083,接下来通过试验来验证它们读取的优先级。
1.直接运行启动类main方法,结果如下:

说明是与src同级的config文件中的配置文件生效了,即它的优先级最高。
2.删除8080配置文件,再运行启动类main方法:

端口为8084,src同级的配置文件生效。
3.删除8084配置文件,运行启动类main方法:

端口为8081,说明resources下的config文件中的配置文件生效,即resources文件夹下config文件夹中配置文件的优先级高于resources文件夹中的配置文件。
4.删除8081配置文件,运行启动类main方法:

端口为8082,说明resources文件夹下properties类型的优先级高于yml类型。
5.删除8082配置文件,运行启动类main方法:

yml配置文件的优先级低于properties。

通过实验可知配置文件的优先级如下(源码说明):
file:/config/
file:/
classpath:/config/
classpath:/
以上顺序按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级的配置内容会覆盖低优先级配置的内容,其中配置文件中的内容是互补配置,即存在相同的配置内容,高优先级的内容会覆盖低优先级的内容,存在不同的内容的时候,高优先级和低优先级的配置内容取并集。

3.不同环境的配置文件

开发的各个阶段的应用配置也各不相同,像路径、数据库等等,SpringBoot针对这种情况提供了多环境配置功能:即
为每个环境单独新建一个配置文件,命名规则为:application-环境标识.properties:

application.properties和application.yml是总配置文件,下面三个分别为开发、生产、测试环境的配置文件。
Spring Boot 不会直接启动这些环境的配置文件,在不指定配置文件时,它默认使用 application.properties/yaml/yml 主配置文件,并用profile的active 属性来指定使用哪个配置文件启动项目。

spring.profiles.active=dev

运行启动类的main方法:

主配置文件active属性改为test后再启动:

yml类型的设置与此类似:

4.yml配置文件的语法

由于yml类型配置文件更加直观易读,我们主要使用这种配置文件,它的语法如下:
1.普通数据
语法:
key: value

username: root

2.对象数据与map数据
语法:
key:
key1: value1
key2: value2
或者:
key: {key1: value1,key2: value2}

phone: {name: oppo,price: 3999.0}
#或者
phone1:name: appleprice: 5999.0

3.数组(List、Set)数据
语法:
key:
-value1
-value2
或者:
key: [value1,value2]
List:

country:- China- UK- US- Japan

或者

country: [China,UK,US,Japan]

Set:

goods:- category: phone brand: oppoprice: 3999.0- category: carbrand: bmwprice: 399999.0- category: bicyclebrand: meridaprice: 3999.0

5.配置文件与配置类的属性映射方式

除了上述SpringBoot自带的配置项,还可以在配置文件中写入自定义的参数,再通过注解拿到这些参数。
1.我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上,例如:
application.properties配置如下:

spring.profiles.active=test
person.name=zhangsan
person.age=18

application.yml

spring:profiles:active: dev
person:name: zhangsanage: 18

要映射的bean如下:

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BeginDemo {@Value("${person.name}")private String name;@Value("${person.age}")private Integer age;@RequestMapping("/person")@ResponseBodypublic String quick(){return "springboot 访问成功! name="+name+",age="+age;}
}

浏览器访问localhost:8092/person,效果如下:

2.使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方
法才可以,而使用@Value注解修饰的字段不需要提供set方法。
先准备一个实体类,用于映射字段:

@Data注解可以帮我们自动生成get/set方法
@Component注解表明要把这个类实例化到spring容器中
@ConfigurationProperties注解会自动映射配置文件和实体属性,括号里的前缀可以区分同名的属性。

@Controller
public class BeginDemo {@Autowiredprivate Person person;@RequestMapping("/person")@ResponseBodypublic String quick(){return "springboot 访问成功! name="+person.getName()+",age="+person.getAge();}
}

运行启动类的main方法,浏览器访问http://localhost:8092/person
结果:

application.properties已改为:

spring.profiles.active=test
person.name=laowang
person.age=81

成功读取到配置文件中的参数。

**注意:**在 Person类中使用 ConfigurationProperties 注解后,IDEA 会出现一个警告,不影响程序的执行。

在pom文件中加入以下依赖可以解决:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional>
</dependency>

spring-boot-configuration-processor就是给自定义的配置类生成元数据信息的,添加这个依赖后不会报上面那个错了。

参数中的中文通过注解拿到后会显示乱码,可以通过设置配置文件的编码格式来处理,改为UTF-8:

这节主要介绍了SpringBoot配置文件的相关知识,下节开始学习SpringBoot整合其他技术。

【SpringBoot】SpringBoot配置文件相关推荐

  1. SpringBoot YML配置文件

    引言 在之前的博客中说到了怎么样去创建一个SpringBoot的项目以及创建这个Spring项目之后怎么去启动使用这个SpringBoot的项目文件,还有就是SpringBoot项目的启动原理.下面的 ...

  2. SpringBoot写配置文件报错“The elements [xxx,xxx] were left unbound.“

    异常 在SpringBoot的配置文件application.yaml中写配置报错: 2021-06-22 21:01:01.962 WARN 28928 --- [ main] ConfigServ ...

  3. [学习记录] SpringBoot 5. 配置文件

    SpringBoot 5. 配置文件 尚硅谷 官方文档 1. yaml 文件 适合用来做以数据为中心的配置文件. 1.1 基本语法 key: value 大小写敏感 使用缩进表示层级关系 # 表示注释 ...

  4. SpringBoot之配置文件,带你全面掌握高级知识点

    pets:‐ cat‐ dog‐ pig 而第二种写法则是yaml对于这类数组类型的优化写法,支持将值写入一行,代表一个数组的值,使用[]进行包裹,如下: pets: [cat,dog,pig] 自动 ...

  5. springboot自动配置文件读取以及源码分析

    今天来讲讲springboot自动配置文件读取以及源码分析 springboot启动之后 1.首先进入@springbootApplication(如上图) 里面的**@EnableAutoConfi ...

  6. SpringBoot第 5 讲:SpringBoot+properties配置文件读取

    一.创建Maven项目 参考:SpringBoot第 1 讲:HelloWorld_秦毅翔的专栏-CSDN博客 二.修改pom.xml pom.xml中只需要添加springboot依赖即可 < ...

  7. 你只知道@Value?设置server.port就能定义端口号是如何实现的?springboot读取配置文件的多种方式以及源码解析

    你只知道@Value?设置server.port就能定义端口号是如何实现的?springboot读取配置文件的多种方式以及原理解析 一.SpringBoot全局配置文件优先级 二.属性注入常用注解 1 ...

  8. Linux使用Docker安装Nacos并配置MySQL数据源,将Springboot的配置文件部署到Nacos

    Linux使用Docker安装Nacos并配置MySQL数据源,将Springboot的配置文件部署到Nacos 前言 一.Docker中安装配置Nacos 安装Docker 拉取Nacos镜像 启动 ...

  9. Java|Kotlin, SpringBoot从配置文件中读取@KafkaListener参数配置

    springboot从配置文件中设置@KafkaListener参数配置 在java中使用占位符#{'${kakfa.topics}'}来进行参数注入 @KafkaListener(topics = ...

  10. 一文了解SpringBoot的配置文件

    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringBoot相关知识相关知识,打造完整的云原生学习步骤,提升工程化编码能力和思维能力,写出高质量代码.希望大家都能够从中有所收获,也请大家多 ...

最新文章

  1. 安装和配置Tomcat
  2. 如何避免把 Python 代码写得跟屎一样?
  3. 转载的SSO文章,很基础
  4. Spring4基础 学习笔记(5) ---- Spring与Dao
  5. spring aop 中@annotation()和自定义注解的使用
  6. 苹果“炸场”发布会:搭载刘海屏的MacBook Pro来了,还有AirPods 3...
  7. 苹果AirPods Max拼多多百亿补贴价来了:券后价3999元
  8. Unity3D之NGUI基础5:UISprite显示图片
  9. 181113每日一句
  10. 软件测试 - 用例篇
  11. 为什么建议每个开发人员都需要学Python?
  12. 2022年低压电工考试及低压电工模拟考试题库
  13. Servlet JSP 面试题
  14. 如何选择频谱监测的天线?
  15. 深耕智慧园区 看龙田科技与华为的“默契”
  16. 对数与指数函数的求导
  17. 克隆虚拟机后开机出现device eth0 does not seem to be present delaying initializa错误
  18. android USB OTG功能如何打开及实现
  19. 微信公众号接入百度机器人
  20. 网络编程学习_TCP协议

热门文章

  1. VC++钩子使用之全局键盘钩子
  2. 获取某一帧、某一秒、某几秒画面
  3. 数学图形(1.22) 蔓叶线
  4. subprocess.Popen获取子程序输出
  5. 光电二极管的采样电路
  6. c# Internet时间服务器同步
  7. ACM在线评测系统 各大高校的ACM在线测评系统
  8. Python+pyc文件编译和运行
  9. 2019高考江苏卷语文作文
  10. Intellij IDEA代码后缀补全