通常在一个项目中,老是会有好多个环境。好比: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让环境配置变得轻松不少。