我们的一些配置信息需要比较频繁的修改,如果这些配置信息是放在项目中的话,那么就需要经常进行打包部署,我们就可以把这个配置文件外置。
大部分的配置信息,我们都是配置在application.yaml或application.properties,那么这两个文件是可以外置的。
Springboot的application.yaml或application.properties配置文件的加载路径优先级(从高到低)
工程根目录:./config/
工程根目录:./
classpath:/config/
classpath:/
如:
这里配置文件可以直接读取,优先级最高
这里配置文件可以直接读取,优先级第二
剩下的两个就是在开发时resource下的config目录里面的配置文件,resource下的配置文件
如果自定义的目录,比如conf的话,这个时候就不能识别了,可以使用
--spring.config.location
进行指定路径,执行命令如下:
java -jar springboot-out-properties-0.0.1-SNAPSHOT.jar --spring.config.location=conf/application.properties
也可以使用绝对路径进行指定:
java -jar springboot-out-properties-0.0.1-SNAPSHOT.jar--spring.config.location=/Users/chen/Downloads/conf/application.properties
在项目中,有些配置会自定义propreties文件进行使用,比如定义了demo.properties:
demo.nickname = hello.10
使用@PropertySource指定配置文件:
@Configuration
@ConfigurationProperties(prefix = "demo")
@PropertySource(value = {"classpath:demo.properties"})
那么此时是可以访问到这个配置文件的,打成jar包,执行命令:
java -jar springboot-out-properties-0.0.1-SNAPSHOT.jar
将demo.properties放到和jar包同路径下,修改demo.name的值为hello.11,执行上面的命令,结果还是hello.10,说明Spring Boot对于自定义的properties文件并不能自己从外部去寻找。对于这个问题
很简单,@PropertySource支持多配置多个路径,可以这么配置:
@PropertySource(value ={"classpath:demo.properties","file:./demo.properties"},ignoreResourceNotFound =true)
当我们配置多路径,且多路径下配置文件都存在时,SpringBoot会都加载且会覆盖相同内容。所以当我们配置信息只区分外部和内部路径、内容完全相同时,将file路径写在后面就可以了。当我们本地启动时,因为不存在file路径,所以会加载classpath;当jar启动时,file路径会覆盖classpath路径下的内容;
ignoreResourceNotFound = true 一定要加上,否则找不到会报错。加上之后会忽略找不到的配置文件。此时将配置文件demo.properties放到和jar包同级下就可以了。