• SpringBoot 配置文件加载优先级


    1、 SpringBoot内外部配置文件加载和优先级!

    前言:

    Spring这么流星很重要的一个思想是:配置化思想。从而达到解耦的目的,很多都不需要硬编码,配置一下即可完成,可谓大大提高了编码的效率。
    Spring支持的配置文件加载的方式繁多,一方面是扩大了灵活性,另一方面其实也带来了较大的复杂性。因此本文旨在用一篇文章解决读者朋友的烦恼,同时有时候也是你我的烦恼。
    我们知道SpringBoot支持三种配置文件:
    application*.yml
    application*.yaml
    application*.properties 
    示例:
    在 Resources 文件夹下新建 application.yml 和 application.properties 文件。

    application.properties:
    server.port=8001
    
    application.yml :
    server:
      port: 7001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行程序:
    SpringBoot内外部配置文件加载和优先级_经验分享
    通过运行结果,我们可以得出:
    这三种配置文件以 application*.properties 优先级最高,application.properties 和 yml 文件在并存时(同一目录下),
    application.properties 优先级更好,会先读它,若它没有,再去读yml中的值。
    下面所有的Demo代码都以 yml 进行演示

    2、内部的配置文件加载

    在这里插入图片描述
    项目启动后扫描顺序:

    1)先去项目根目录找config文件夹下找配置文件件
    2)再去根目录下找配置文件
    3)去resources下找cofnig文件夹下找配置文件
    4)去resources下找配置文件

    以上四个目录,SpringBoot 启动时会按照优先级从低到高的顺序,所有的配置文件都会被加载,高优先级的配置文件会覆盖低优先级的配置文件内容。
    SpringBoot 会按照四个位置全部加载配置文件,如果高优先级的配置文件属性和低优先级的配置文件属性不冲突,则会共存互补。
    按照上面的目录,我们在项目中分别建立对应的文件夹和文件夹下的文件,配置文件的优先级为:在这里插入图片描述
    备注:
    这里说的配置文件,都还是项目里面。最终都会被打进jar包里面的,需要注意。
    1)、如果同一个目录下,有 application.yml 也有 application.properties,默认先读取 application.properties。
    2)、如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
    3)、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”

    3 外部配置文件加载

    有的时候,配置信息是我们无法在开发过程中就能确定的。比如,给客户开发的项目,客户需要根据自身的情况自定义配置,如数据库配置,加密密钥配置等等。
    这时候,就需要把配置文件放在外面,让用户自定义配置部署了。
    SpringBoot 打包时不会把 ./config ./这两级的目录打包进去。这个设计很巧妙,因为没有打包进来,所以SpringBoot可以加载外部发配置文件。
    SpringBoot 支持把配置文件放在外部。只要把配置文件放在jar包的同级目录下,或者放在同级下的config文件夹中,SpringBoot都会去此处读取配置文件

    1)、现在有一个SpringBoot 打包程序,(有一个配置文件 application.yml 在默认的 Resources 文件夹下):
    在这里插入图片描述

    2)、这时,我们在根目录添加配置文件 application.properties:
    在这里插入图片描述

    3)、这时,我们在根目录添加文件夹和配置文件 ./config/application.properties
    在这里插入图片描述

    4、命令行配置方式

    比如 java -jar 这种方式,多个属性之间用空格分开,properties 里的属性基本都能用,用法是属性项=属性值这种方法,举个例子:
    复制
    java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=8002 --server.context-path=/example

    上面的命令行进行了两个配置 server.port 和 server.context-path。可以根据需要进行配置。
    如果我们外部的配置文件不想放在默认的位置,可使用 --spring.config.location 命令指定配置文件的目录。
    在根目录新建 test 文件夹,把 application.properties 配置文件放入其中:

    在这里插入图片描述

    5、优先级从高到低

    优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 。

    1)命令行参数。所有的配置都可以在命令行上进行指定;
    2)来自java:comp/env的JNDI属性;
    3)Java系统属性(System.getProperties());
    4)操作系统环境变量 ;
    5)jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    6)jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
    7)jar包外部的application.properties或application.yml(不带spring.profile)配置文件
    8)jar包内部的application.properties或application.yml(不带spring.profile)配置文件
    9)@Configuration注解类上的@PropertySource

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【Swift 60秒】08 - Simple types:Summary
    Vue2、Vue3知识总结---完整版✨
    Python爬虫详解
    基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)
    【C++】class的设计与使用(三)mutable(可变)和const(不变)
    【笔记】Nginx(5)七层负载均衡
    机器人中的数值优化(十九)—— SOCP锥规划应用:时间最优路径参数化(TOPP)
    uniapp掉完接口后刷新当前页面方法
    C and C++ 在线参考手册
    11.11 校招 实习 内推 面经
  • 原文地址:https://blog.csdn.net/web13985085406/article/details/126114306