springboot如何引⽤外部配置⽂件(fig.location)springboot 如何引⽤外部配置⽂件(fig.location)
⼀、背景
本⽂写的是单应⽤下的springboot,并⾮微服务,如果是微服务可以参考nocos或者springcloud config。
⼀般在企业开发流⽔线中,都会涉及到⼏个环境的发布,dev开发环境,test测试环境,prod⽣产环境等等,那么如果需要发布⼀个项⽬到不同的环境会有⼏种⽅式:(个⼈拙见)
1. 第⼀,可以通过maven打包的⽅式指定特定环境的配置,这种⽅式就需要在打包的时候对环境做出区分,对于⼀些企业可能打包的⼯
具是不区分环境的。
2. 第⼆,也可以通过springboot运⾏时指定配置⽂件的环境,这样的话配置⽂件可能需要被管理在项⽬中,那么⽆法很好保护⽣产环境
的配置。
3. 第三,也可以通过环境变量的⽅式,区分不同环境的配置,这种⽅式缺点是要维护⼀份环境变量的⽂件,没有配置⽂件来的简便,不
过也是⼀种⽅式。
4. 最后就是就特定环境的配置放在服务器特定⽬录下,通过项⽬引⽤外部的配置⽂件来区分环境。
现在就按第四种展开。先了解springboot的默认加载⽅式。
⼆、springboot 默认的配置⽂件加载顺序
24.3 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:
A /config subdirectory of the current directory.
The current directory
为什么使用bootstrap?A classpath /config package
The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
这⾥说了四种⽅式可以把配置⽂件放到外部的。
1. 第⼀种是在jar包的同⼀⽬录下建⼀个config⽂件夹,然后把配置⽂件放到这个⽂件夹下;
2. 第⼆种是直接把配置⽂件放到jar包的同级⽬录;
3. 第三种在classpath下建⼀个config⽂件夹,然后把配置⽂件放进去;
4. 第四种是在classpath下直接放配置⽂件。
这⾥的优先级也是依次降低,优先级⾼的覆盖优先级低的,可以注意点的是,只是对相同配置项才会产⽣覆盖作⽤,不同的话是互补作⽤,也就是说如果四个地⽅都配了的话,是会累加起来的。
另外,如果我们需要⾃定义配置⽂件路径的话,可以通过命令⾏启动程序时配置 --fig.location=xxx.properties就可以达到⽬的,但是对运维就不太优化,因为在启动命令时候要配置好这个特定项⽬路径。那么如果通过⼀个配置项fig.location来实现配置。
三、fig.location为什么没有⽣效
原因是在application配置⽂件⾥⾯指定fig.location的优先级太低了,加载太迟了,导致加载不到特定的配置⽂件,因此在通过命令⾏启动的⽅式可以提⾼优先级,加载到配置⽂件。
四、通过spring.cloud的⽅式
spring cloud中 通过l/properties来加载配置中⼼的配置。那么bootstrap/ application 的区别?
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下⽂,⼀种是 bootstrap, 另外⼀种是 application, bootstrap 是应⽤程序的⽗上下⽂,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要⽤于从额外的资源来加载配置信息,还可以在本地外部配置⽂件中解密属性。这两个上下⽂共⽤⼀个环境,它是任何Spring应⽤程序的外部属性的来源。bootstrap ⾥⾯的属性会优先加载,它们默认也不能被本地相同配置覆盖。
因此,对⽐ application 配置⽂件,bootstrap 配置⽂件具有以下⼏个特性。
1. boostrap 由⽗ ApplicationContext 加载,⽐ applicaton 优先加载
2. boostrap ⾥⾯的属性不能被覆盖
好了 最后通过引⽤组件:Spring Cloud Context,bootstrap⽂件才能⽣效。
<!--需要引⼊该jar才能使bootstrap配置⽂件⽣效-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
完毕。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论