一般情况下,springboot默认会在resource目录下生成一个配置文件(Application.properties或application.yaml),但其实springboot允许配置多个配置文件(application.properties或application.yaml),但是这并不意味着这些配置文件一定会替换默认生成的配置文件,它们是互补的存在。如果在某些场景下需要把配置文件单独拿出来并且启动的时候加载进去,那么外部的配置文件将是一个很好的选择。
需要注意的是配置文件加载顺序加载顺序在springboot 2.4.0前后是不一样的。
file:./config/file:./config/*/file:./classpath:config/classpath:复制代码
file:./config/*/file:./config/file:./classpath:config/classpath:复制代码
区别在于springboot 2.4.0之后的版本将file:./config/*/的在顺序调整为第一加载顺序。
file是指当前jar包所在路径。
classpath是指springboot resource文件夹下路径。
@SpringBootApplicationpublic class MqApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(MqApplication.class, args);ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("spring.application.name");System.out.println("current spring.application.name="+property);}}复制代码
配置文件:
spring.application.name=classpathserver.port=8080复制代码
为了验证 springboot 2.4.0之前和之后的版本加载顺序的不一样,会使用两个版本对比。 对比版本:springboot 2.4.3 和 springboot 2.3.5.RELEASE
下面是不同路径下配置不同端口和应用名以便验证。
路径 |
端口号 |
application.name |
file:./config/*/ |
8084 |
file:./config/*/ |
file:./config/ |
8083 |
file:./config/ |
file:./ |
8082 |
file:./ |
classpath:config/ |
8081 |
classpath:config/ |
classpath: |
8080 |
classpath: |
根据上述表格,将配置文件分别复制到不同的路径下创建配置文件并按表格修改spring.application.name和server.port属性值。
启动项目,下面是两个版本的启动信息:
从两张图中可以得出结论:
server.port=8080server.error.path=/test复制代码
spring.application.name=file:.server.port=8082server.servlet.context-path=file_context复制代码
server.port=8084spring.application.name=file:./config/*/复制代码
public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(MqApplication.class, args);ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("spring.application.name");System.out.println("current spring.application.name="+property);String errorPath = environment.getProperty("server.error.path");System.out.println("errorPath="+errorPath);}复制代码
从上面截图中可以发现三个配置文件中的所有属性都被加载出来了,而且优先级高的配置文件中的属性会覆盖优先级低的配置文件中的属性。
springboot中可以配置多个配置文件,并且这些配置文件是可以共存的。当属性相同时,优先级高的配置文件会覆盖优先级低的配置文件中的属性;当属性不同时,最终的配置会取各个配置文件中属性的并集。
作者:索码理
链接:
https://juejin.cn/post/7126394308294344711
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。