springboot读取配置⽂件的顺序
Spring Boot启动会扫描以下位置的application.properties或者l⽂件作为Spring Boot的默认配置⽂件
外部配置的加载顺序说明
SpringApplication loads properties from application.properties files in the following locations and adds them to the Spring Environment:
1. A /config subdirectory of the current directory
2. The current directory
3. A classpath /config package
4. The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
读取位置就是:
1. file:/config/
2. file:/
3. classpath:/config/
4. classpath:/
以上顺序按照优先级从⾼到低的顺序,所有位置的⽂件都会被加载,⾼优先级的配置内容会覆盖低优先级配置的内容,其中配置⽂件中的内容是互补配置,即
存在相同的配置内容,⾼优先级的内容会覆盖低优先级的内容存在不同的内容的时候,⾼优先级和低优先级的配置内容取并集我们也可以通过fig.location来改变默认的配置,具体做法就是项⽬打包好以后,我们可以使⽤命令⾏参数的形式,启动项⽬的时候来指定配置⽂件的新位置,指定配置⽂件和默认加载的配置⽂件共同起作⽤称为互补配置
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --fig.location=D:/application.properties
外部配置的加载顺序
命令⾏参数命令⾏参数的优先级是最⾼的,假定内部配置的最⾼优先级配置⽂件配置的启动端⼝号是8081,启动命令⾏参数如以下设置:
java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8089
那么启动的端⼝就改成了8089,命令⾏可以把项⽬的所有的配置选项全部都改掉
Spring Boot也可以从以下位置加载配置:优先级从⾼到低顺序,⾼优先级覆盖低优先级,如有不同内容,⾼优先级和低优先级形成互补配置
1. 来⾃java:comp/env的JNDI属性
2. java系统属性(Properties())
3. 操作系统环境变量
4. RandomValuePropertySource配置的random.*属性值
5. jar包外部的application-{profile}.properties或者l(带spring.profile)配置⽂件
6. jar包内部的application-{profile}.properties或者l(带spring.profile)配置⽂件
7. jar包外部的application.properties或者l(不带spring.profile)配置⽂件
8. jar包内部的application.properties或者l(不带spring.profile)配置⽂件springcloud和springboot
9. @Configuration注解类上的@PropertySource
10. 通过SpringApplication.setDefaultProperties指定的默认属性
其它
搭建springcloud项⽬,抽出了个公共的common模块,其他服务依赖于common模块。
我搭springboot项⽬⼀般习惯分l、l、l三个配置⽂件,l为主配置⽂件,通
过spring.profiles.active属性指定其他配置⽂件,开发时指定为dev环境,线上指定为prod,⽅便切换。
问题
由于我将数据库信息配置在了common模块,同样的建⽴了这三个配置⽂件。现在需要开发⽤户user模块,引⼊了common模块,发现不会读取common模块的这三个配置⽂件,连不上数据库。
原因
springboot如果⾃⼰有l,就会覆盖依赖模块的同名配置⽂件。spring.profiles.active也是,先到⾃⾝resource⽬录下,如果不到
再去依赖模块。
例如我在user模块建了l,common模块的l就不会读取。
在user模块l配置了spring.profiles.active: dev,但因为user模块本⾝也有l这个⽂件,所以不会再去读取common 的l配置。
⽅法1
将common模块的配置⽂件名称改掉,例如改成l,然后在user模块⽤spring.profiles.active: dev,common同时引⼊。
因为user模块没有l,就会去common模块。
缺点:这种⽅法如果不⼩⼼起重名了,则会整个覆盖,⽽不是作为补充。并且在切换线上线下环境时也不⽅便。
⽅法2
在common模块的resource⽂件夹下创建个config⽂件夹,把配置⽂件移⼊。也是推荐这种⽅法。
这种⽅法若user模块和common模块的配置⽂件同时存在,会优先⽤user模块的配置,common模块的配置会作为补充
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论