environment
profile
在 Spring Boot 中有两种上下文,一种是 bootstrap另外一种是 application, bootstrap 是应用程序的父上下文,bootstrap用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载。bootstrap 的加载优先于 applicaton,所以优先级从大到小如下:
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
如果你不是spring cloud项目,只是spring boot项目,在启动无法加载到bootstrap的配置,应该为如下解决方式:添加spring-cloud-context的POM依赖
-Dspring.cloud.config.allow-override=false
-Dspring.cloud.bootstrap.enabled=false
测试配置:
三方jar-SPI配置:BootstrapConfiguration:configInBooFactories
本地:bootstrap.properties:configInBooProperties
本地:application.properties:configInAppProperties
启动参数:-Dspring.cloud.bootstrap.enabled=false 结果:configInAppProperties
启动参数:-Dspring.cloud.bootstrap.enabled=true 结果:configInBooFactories
启动参数:-Dspring.cloud.bootstrap.enabled=true 注释掉application.properties与三方jar 结果:configInBooProperties
启动参数:-Dspring.cloud.bootstrap.enabled=false 解析不到bootstrap.properties内容
启动参数:-Dspring.cloud.bootstrap.enabled=true 注释掉application.properties开启三方jar 三方jar优于本地本地bootstrap.properties 结果:configInBooFactories
bootstrap开启:三方 大于 app 大于 boo
bootstrap关闭:三方、boo不生效 只有app
待测试:如果使用启动参数,优先级该如何排序?
applicaiton.properties大于bootstrap.properties
1)命令行参数。所有的配置都可以在命令行上进行指定;
2)来自java:comp/env的JNDI属性;
3)Java系统属性(System.getProperties());
4)操作系统环境变量 ;
5)jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
6)jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
7)jar包外部的application.properties或application.yml(不带spring.profile)配置文件
8)jar包内部的application.properties或application.yml(不带spring.profile)配置文件
9)@Configuration注解类上的@PropertySource
1、java -jar 命令行中,通过 --spring.config.location 参数指定的方式优先级最高。
2、项目 jar 包同级下直接放 properties 文件次之,直接把配置文件放到 jar 包的同级目录。
3、项目内部的 classpath 同级 config 文件夹,在 classpath 下建一个 config 文件夹,然后把配置文件放进去。
4、项目内部的 classpath 同级放 properties yum 文件是最低优先级,是在 classpath 下直接放配置文件
Bootstrap 上下文是 Spring Cloud 新引入的,与传统 Spring 上下文相同,即 ConfigurableApplicationContext 实例,由 BootstrapApplicationListener 监听 ApplicationEnvironmentPreparedEvent 事件时创建。