关于配置的优先级
Spring Boot提供了一种优先级配置读取的机制来帮助我们从这种困境中走出来。
Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表(从高到低)如下所示。
- 1.命令行参数(优先级最高)。
- 2.通过 System.getProperties() 获取的 Java 系统参数。
- 3.操作系统环境变量。
- 4.从 java:comp/env 得到的 JNDI 属性。
- 5.通过 RandomValuePropertySource 生成的random.*属性。
- 6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件,通过spring.config.location参数指定
- 7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- 8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- 9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- 10.应用 Java配置类,包含@Configuration注解的 Java 类,通过@PropertySource注解声明的属性文件。
- 11.通过SpringApplication.setDefaultProperties声明的默认属性。
如果Spring Boot在优先级更高的位置找到了配置,那么它就会忽略优先级低的配置。下面我们简单讲讲这些优先级。Spring Boot 的这个配置优先级看似复杂,其实是很合理的。命令行参数的优先级之所以被设置为最高,是因为可以方便我们在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。
SpringApplication 类默认会把以“--”开头的命令行参数转化成应用中可以使用的配置参数,如 “--name=Alex” 会设置配置参数 “name” 的值为 “Alex”。
如果不需要这个功能,可以通过SpringApplication.setAddCommandLineProperties(false)
禁用解析命令行参数。