admin管理员组

文章数量:1597897

文章目录

    • 一、配置文件分类
      • 1.1 使用
      • 1.2 优先级
    • 二、YAML
      • 2.1 对比
      • 2.2 基本语法
      • 2.3 数据格式
        • 2.3.1 对象
        • 2.3.2数组
        • 2.3.3 纯量
        • 2.3.4 参数引用
      • 2.4 小结
    • 三、读取配置文件
      • 3.1 @Value
      • 3.2 Environment
      • 3.3 @ConfigurationProperties
    • 四、Profile
      • 4.1 配置方式
        • 4.1.1 多profile文件方式
        • 4.1.2 yml多文档形式
      • 4.2 激活方式
        • 4.2.1 配置文件
        • 4.2.2 虚拟机参数
        • 4.2.3 命令行参数
      • 4.3 小结
    • 五、内外部配置文件加载顺序
      • 5.1 内部配置文件加载顺序
      • 5.2 外部配置文件加载顺序

一、配置文件分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自定义配置替换默认配置的话,可以使用application.propertiesapplication.yml/.yaml进行配置,其中,默认配置文件名称为application

1.1 使用

以配置server port为例:

  • properties: server.port=8080
  • yml/yaml:
server:
  port: 8080

1.2 优先级

在同一级目录下,优先级为:
properties > yml > yaml

二、YAML

YAML全称是 YAML Ain't Markup LanguageYAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。

YAML文件的扩展名可以使用.yml或者.yaml

2.1 对比

如下为propertiesxmlyml的对比:

properties

server.port=8080 
server.address=127.0.0.1

xml

<server>
	<port>8080</port> 
	<address>127.0.0.1</address>
</server>

yml

server:
	port: 8080
	address: 127.0.0.1

对比来看,yml以数据为核心,更加简洁,层次关系清晰

2.2 基本语法

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略。

eg.

server:
	port: 8080
	address: 127.0.0.1 name: abc

2.3 数据格式

2.3.1 对象

对象(map),键值对的集合,格式如下:

person:
	name: zhangsan
# 行内写法
person: {name: zhangsan}
2.3.2数组

一组按次序排列的值,格式如下:

address:
	- beijing
	- shanghai
# 行内写法
address: [beijing,shanghai]
2.3.3 纯量

单个的、不可再分的值,格式如下:

msg1: 'hello \n world' # 单引忽略转义字符 
msg2: "hello \n world" # 双引识别转义字符
2.3.4 参数引用

除声明时直接赋值外,还可使用参数引用方式,如下:

name: lisi
person:
	name: ${name} # 引用上边定义的name值

2.4 小结

  • 配置文件类型
    • properties:和以前一样
    • yml/yaml:注意空格,yaml:简洁,以数据为核心
  • 基本语法
    • 大小写敏感
    • 数据值前边必须有空格,作为分隔符
    • 使用空格缩进表示层级关系,相同缩进表示同一级
  • 数据格式
    • 对象
    • 数组: 使用 “- ”表示数组每个元素
    • 纯量
    • 参数引用
      • ${key}

三、读取配置文件

application.yml中,配置如下:

company: 微软
msg: 'hello \n world'
msg2: "hello \n world"
# 对象
person:
  name: 旺财
  age: 12
  books: [三国演义,'水浒传']
# 数组
student: {name: 小强, age: 8}
hobbies:
  - 抽烟
  - 喝酒
  - 烫头
server:
  port: 8080

3.1 @Value

获取并打印信息,如下:

@Value("${company}")
private String company;

@Value("${hobbies[0]}")
private String hobby;

@Value("${msg}")
private String msg1;

@Value("${msg2}")
private String msg2;


System.out.println("------------通过@Value获取配置信息-------------");
System.out.println(company);
System.out.println(hobby);
System.out.println(msg1);
System.out.println(msg2);

输出结果为:

------------通过@Value获取配置信息-------------
微软
抽烟
hello \n world
hello 
 world

3.2 Environment

通过环境信息获取,如下:

@Autowired
private Environment env;
System.out.println("------------通过Environment获取配置信息-------------");
System.out.println(env.getProperty("company"));
System.out.println(env.getProperty("person.age"));

输出结果如下:

------------通过Environment获取配置信息-------------
微软
12

3.3 @ConfigurationProperties

可以通过@ConfigurationProperties注解完成对象信息获取,新建Person类,如下:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private String[] books;

    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;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", books=" + Arrays.toString(books) +
                '}';
    }
}

调用如下:

@Autowired
private Person person;
System.out.println(env.getProperty("person.age"));
System.out.println("------------通过@ConfigurationProperties获取配置信息-------------");

输出结果为:

------------通过@ConfigurationProperties获取配置信息-------------
Person{name='旺财', age=12, books=[三国演义, 水浒传]}

四、Profile

在开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。

profile功能就是来进行动态配置切换的。

4.1 配置方式

4.1.1 多profile文件方式

新建application-dev.propertiesapplication-pro.properties分别表示开发和生产环境,内容只对server.port做不同配置,代码如下:

application-dev.properties

server.port=8081

application-pro.properties

server.port=8082

application.properties中标记active,如下:

spring.profiles.active=pro

此时,直接运行,如图:

启动日志:

The following profiles are active: pro
Tomcat started on port(s): 8082 (http) with context path ''

这样就完成生产环境的配置,同理开发环境也是如此。

4.1.2 yml多文档形式

application.yml文件中,通过---做文档片断间隔,分别声明devprod环境,如下:

---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: pro
---

同样,通过spring.profiles.active进行环境指定,如下:

spring:
  profiles:
    active: dev

同样可以完成不同环境的切换

4.2 激活方式

4.2.1 配置文件

上述方法都是通过在配置文件中spring.profile.active进行指定来完成不同环境的激活,此处不再赘述。

4.2.2 虚拟机参数

IDEAEdifConfigurations中,配置虚拟机参数,如下:

此时,再次启动就按照我们新配置的方式进行环境选择了。

4.2.3 命令行参数

如果打出jar包,通过命令行运行的话,可以通过命令行参数来启动,如下:
java–jarxxx.jar --spring.profiles.active=dev

4.3 小结

  • profile是用来完成不同环境下,配置动态切换功能的
  • profile配置方式
    • profile文件方式:提供多个配置文件,每个代表一种环境
      • application-dev.properties/yml开发环境
      • application-pro.properties/yml 生产环境
      • application-test.properties/yml 测试环境
    • yml多文档方式:
      • yml中使用 — 分隔不同配置
  • profile激活方式
    • 配置文件: 再配置文件中配置spring.profiles.active=dev
    • 虚拟机参数:在VM options 指定-Dspring.profiles.active=dev
    • 命令行参数:java–jarxxx.jar --spring.profiles.active=dev

五、内外部配置文件加载顺序

5.1 内部配置文件加载顺序

在通过IDEA启动Springboot程序时,会从以下位置加载配置文件:

  1. file:./config/:当前项目下的/config目录下
  2. file:./:当前项目的根目录
  3. classpath:/config/:classpath/config目录
  4. classpath:classpath的根目录

加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置。

需要注意的是在工程根目录下或者根目录的config下面的配置文件,在工程打包时候不会被打包进去。

5.2 外部配置文件加载顺序

通过java -jar启动时:

  • 通过指定配置spring.config.location来改变默认配置,一般在项目已经打包后,我们可以通过指令 java -jar xxxx.jar --spring.config.location=/Users/xxx/Projects/application.yml来加载外部的配置
  • 命令行参数:java -jar xxx.jar --server.port=8082 --server.servlet.context-path=/hi

当然,也可以在jar包所在目录下新建applicaion.propertiesconfig/application.properties文件,通过java -jar xxx.jar启动,此时加载顺序同内部配置文件,比如根目录下的application.propertie/yml会比jar内部的application.propertie/yml优先级要高

外部文件属性加载配置点击前往官方介绍

本文标签: 配置文件详解SpringBoot