Spring Boot -- 配置切换指南

通常在一个项目中,老是会有好多个环境。好比:java

开发环境 -> 测试环境 -> 预发布环境 -> 生产环境mysql

每一个环境上的配置文件老是不同的,甚至开发环境中每一个开发者的环境可能也会有一点不一样,配置读取但是一个让人有点伤脑筋的问题。spring

Spring Boot提供了一种优先级配置读取的机制来帮助咱们从这种困境中走出来。sql

常规状况下,咱们都知道Spring Boot的配置会从application.properties中读取。实际上,从resource目录下的application.properties文件读取是Spring Boot配置链中的一环而已。数据库

根据Spring Boot的文档,配置使用的优先级从高到低的顺序,具体以下所示:app

1. 命令行参数。
2. 经过 System.getProperties() 获取的 Java 系统参数。
3. 操做系统环境变量。
4. 从 java:comp/env 获得的 JNDI 属性。
5. 经过 RandomValuePropertySource 生成的“random.*”属性。
6. 应用 Jar 文件以外的属性文件(application.properties)。
7. 应用 Jar 文件内部的属性文件(application.properties)。
8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中经过“@PropertySource”注解声明的属性文件。
9. 经过“SpringApplication.setDefaultProperties”声明的默认属性。

这意味着,若是Spring Boot在优先级更高的位置找到了配置,那么它就会无视低级的配置。dom

好比,我在application.properties目录中,写入本地的MySQL的配置:ide

db.jdbc.driver=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
db.jdbc.username=username
db.jdbc.password=password

在本身项目调试的阶段,项目老是会使用本地的MySQL数据库。而一旦打包以后,在外部声明一个test_evn.properties.测试

启动Jar包的时候, 指定一个外部配置文件:url

java -jar demo.jar --spring.config.location=/path/test_evn.properties

这样一来,咱们在开发者的机器上老是使用本身的配置,而一到对应的环境,就会使用高级的位置所作的配置。

在代码中读取这些配置也是很是方便的,在代码的逻辑中,实际上是无需去关心这个配置是从什么地方来的,只用关注能获取什么配置就够了。

public class ApplicationConfigure {

    @Value("${db.jdbc.driver}")
    private String jdbcDriver;
    @Value("${db.jdbc.url}")
    private String jdbcUrl;
    @Value("${db.jdbc.username}")
    private String jdbcUsername;
    @Value("${db.jdbc.password}")
    private String jdbcPassword;
    
    // mysql config class
    // ..... 
    
}

有时候咱们在项目启动的时候,老是须要先启动一些初始化的类,之前比较常见的作法是写再static块中,Spring Boot提供了一个CommandLineRunner接口,实现这个接口的类老是会被优先启动,并优先执行CommandLineRunner接口中提供的run()方法。

public class ApplicationConfigure implements CommandLineRunner  {

    @Value("${db.jdbc.driver}")
    private String jdbcDriver;
    @Value("${db.jdbc.url}")
    private String jdbcUrl;
    @Value("${db.jdbc.username}")
    private String jdbcUsername;
    @Value("${db.jdbc.password}")
    private String jdbcPassword;
    
    // mysql config class
    // ..... 
    @Override
    public void run(String... strings) throws Exception {
        // 预先加载的一些方法,类,属性。
    }
}

若是有多个CommandLineRunner接口实现类,那么能够经过注解@Order来规定全部实现类的运行顺序。

经过这一系列API的帮助,Spring Boot让环境配置变得轻松不少。

相关文章
相关标签/搜索