文章插图
本文主要针对 spring.profiles.active、spring.config.location 以及
spring.config.additional-location 的作用机制及优先级问题进行实践对比 。
本文案例工程已上传 github 仓库:spring.profiles.active除了 application.properties 文件之外 , profile-specific 配置也可以通过以下命名方式来定义:application-{profile}.properties 。在没有使用 active 指定 profiles 的情况下 , Environment 会指定一组默认的 profiles(默认情况下是[default]) , 换句话说就是 , 如果没有显示的激活 profiles 配置文件 , 则默认加载的是
https://github.com/glmApper/springboot-series-guides/tree/master/guides-properties
application-default.properties 配置文件 。
profile-specific 配置文件的属性与标准 application.properties 从相同的位置加载(一般是 classpath 下);profile-specific 指定的 properties 配置文件始终覆盖默认配置 。
在案例工程中(guides-properties) , resources 下面包括 application.properties 和
application-dev.properties 两份配置文件
application.properties 文件配置
spring.application.name=appNameInnertestKey=key-default
application-dev.properties 文件配置
testKey=key-dev
通过以下代码在启动时将配置值输出:@Value("${testKey}")private String testKey;@PostConstructprivate void init(){ System.out.println("-------------------------------"); System.out.println(testKey); System.out.println("-------------------------------");}复制代码
不指定 spring.profiles.active 时通过 JAVA -jarguides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 启动工程 , console 输出如下:
2020-01-04 00:08:47.279 INFO 11050 --- [ main] com.glmapper.bridge.boot.BootStrap : No active profile set, falling back to default profiles: default-------------------------------key-default-------------------------------复制代码
结论是 , 如果不显示指定 profiles , 则使用默认的 。指定 spring.profiles.active 时通过 java -jar -Dspring.profiles.active=dev
guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 启动工程 , console 输出如下:
2020-01-04 00:08:14.426 INFO 11040 --- [ main] com.glmapper.bridge.boot.BootStrap : The following profiles are active: dev-------------------------------key-dev-------------------------------复制代码
结论是 , 在显示指定 profiles 的情况下 , 会覆盖默认 application.properties 中的配置值 。spring.config.location在 SpringBoot 2.x 中 spring.config.location 的语义发生了变更(此项配置会导致 classpath 中的 application.properties 不再生效) 。原因如下:
private Set<String> getSearchLocations() { // spring.config.location 直接使用此份文件 , 不会再处理其他配置文件 if (this.environment.containsProperty(CONFIG_LOCATION_PROPERTY)) { return getSearchLocations(CONFIG_LOCATION_PROPERTY); } Set<String> locations = getSearchLocations(CONFIG_ADDITIONAL_LOCATION_PROPERTY); locations.addAll( asResolvedSet(ConfigFileApplicationListener.this.searchLocations, DEFAULT_SEARCH_LOCATIONS)); return locations;}复制代码
在工程的根目录的 conf 目录下新建一个application-conf.properties 配置文件 , 内容如下:
testKey=key-spring.config.location复制代码
【聊一聊 SpringBoot 中配置加载优先级?】通过 java -jar -Dspring.config.location=conf/application-conf.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 启动工程 , 发现启动报错 , 原因是因为 application-conf.properties 中没有 配置 spring.application.name , 而 spring.application.name 是在 resources 目录下的 application.properties 中的 , 所以也间接说明前面提到的 , 会使 classpath 下的配置失效 。新增 spring.application.name 之后 , 重新启动工程 ,
推荐阅读
- openscap 免费开源的扫描工具
- springboot三种拦截器
- 聊聊存储卡选购中的注意事项
- 今天我们为什么要读古诗?今天的古诗为什么_5
- SpringBoot集成多数据源
- SpringBoot整合RabbitMQ四种交换机类型详解
- 相亲聊天怎么聊?
- 程序员标配Springboot!终于有人把SpringBoot讲的通俗易懂了
- 聊聊笔记本行业中的“认证标准”
- 值得现在就去尝试的四款开源聊天应用软件