07、SpringBoot 内部、外部配置文件加载以及Profile配置
Spring Boot    2019-07-29 22:31:29    1597    0    0
acme   Spring Boot

    前面说到了配置文件的拆分,这里继续说配置文件。

    配置文件是有加载顺序的,内部配置文件加载顺序在SpringBoot启动的时候按照高到低的优先级扫描以下位置的默认配置文件并作为SpringBoot的默认配置文件
1、项目路径下的config目录中的配置文件;
2、项目根目录下的配置文件;
3、classpath下的config目录中的配置文件;
4、classpath根目录下的配置文件;
    如果扫描目录下都有配置文件,其中的配置都会加载,会根据优先级的高优先级配置文件中的配置会覆盖低优先级的。
    如果想要改变默认配置文件,在打包好的项目文件,命令行参数可以通过spring.config.location来改变默认配置 --spring.config.location={配置文件绝对路径}

    接着再说一下外部文件的加载顺序,由于外部文件加载的位置比较多,就直接套用官方的文档说明了。

    其实,这个配置文件加载,一般用的并不是很多,所以一笔带过,如果需要的时候翻翻文档就可以了。

    接着再讲一个Profile文件。

    多Profile配置文件指的是什么呢?

    多profile文件,profile用于Spring做多环境切换支持,可以使application-{profile}.properties/yaml:例如:--application-dev.properties、application-test.properties

    激活的时候可以在主配置文件中使用spring.profiles.active=dev

    当然,如果在开发环境,可以使用命令行参数带入--spring.profiles.active={profile},当然,这个参数也可以在maven打包完成以后运行的时候带入参数。

    除此之外,也可以在虚拟机参数中带入,-Dspring.profiles.active={profile}。

其实说这么多不如演示一下,首先还是pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cc.acme_me</groupId>
    <artifactId>springboot-profile</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-profile</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

接着是一个实体类User

package cc.acme_me.springbootprofile.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;
    private String userName;

    public Integer getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                '}';
    }
}

测试类SpringbootProfileApplicationTests

package cc.acme_me.springbootprofile;

import cc.acme_me.springbootprofile.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootProfileApplicationTests {

    @Autowired
    private User user;

    @Test
    public void contextLoads() {
        System.out.println(user);
    }

}

上面已经将测试环境搭好了,接下来要做的便是添加配置文件。

先使用properties文件来配置文档

首先是默认的配置文件application.properties

#用于切换配置文件
spring.profiles.active=dev

user.id=1
user.userName=admin

接着是application-dev.properties

user.id=2
user.userName=admin_dev

最后是application-test.properties

user.id=3
user.userName=admin_test

我们首先将默认配置文件中的spring.profiles.active=dev注释掉,然后执行测试类

执行结果如下

接着将spring.profiles.active=dev注释去除

执行结果如下

最后更改配置spring.profiles.active=test

执行结果如下

到这里已经执行玩properties配置的方式,现在我们讲主配置文件的内容全部注释掉,新建一个application.yml文件

user:
  id: 4
  user-name: admin_yml
---
user:
  id: 5
  user-name: admin_yml_dev
spring:
  profiles: yml_dev

---
user:
  id: 6
  user-name: admin_yml_test
spring:
  profiles: yml_test

在yml文件中,可以使用---来划分块,使用

spring:
  profiles: yml_test

配置相当于上面的命名方式,为这个块去一个名字一样。

现在执行测试类

结果如下

现在更改配置yml的配置文件

user:
  id: 4
  user-name: admin_yml
spring:
  profiles:
    active: yml_dev
---
user:
  id: 5
  user-name: admin_yml_dev
spring:
  profiles: yml_dev

---
user:
  id: 6
  user-name: admin_yml_test
spring:
  profiles: yml_test

可以看到,增加了一条配置属性

spring:
  profiles:
    active: yml_dev

在yaml块中使用该配置激活配置快,再次运行测试类得到结果如下

同样的,更改

spring:
  profiles:
    active: yml_test

运行结果如下

到这里,使用yml块的配置也完成了。

不过就这样结束似乎有点可惜,刚刚将application.properties文件中的配置全部注释掉,但是application-dev.properties和application-test.properties文件还存在,那么这里更改一下可以使用吗?

将yml文件中的配置进行更改

user:
  id: 4
  user-name: admin_yml
spring:
  profiles:
    active: dev
---
user:
  id: 5
  user-name: admin_yml_dev
spring:
  profiles: yml_dev

---
user:
  id: 6
  user-name: admin_yml_test
spring:
  profiles: yml_test

运行测试类的结果

表示可以混用

 

 

Pre: 针对Leanote使用的MongoDB存储引擎升级

Next: 06、Spring Boot,占位符

1597
Table of content