Spring Boot 允许你从外部加载配置,这样的话,就可以在不同的环境中使用相同的代码。支持的外部配置源包括:Java属性文件、YAML文件、环境变量、命令行参数。

用@Value注解可以将属性值直接注入到beans中。命令行参数以 -- 开头

配置文件加载的顺序如下:

  1. Application properties packaged inside your jar (application.properties and YAML variants)
  2. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
  3. Application properties outside of your packaged jar (application.properties and YAML variants)
  4. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)

应用程序启动的时候,Spring Boot 会自动从以下位置查找并加载 application.properties 和 application.yaml 文件:

  1. The classpath root
  2. The classpath /config package
  3. The current directory
  4. The /config subdirectory in the current directory
  5. Immediate child directories of the /config subdirectory

查找顺序按优先级来,后面的可以覆盖前面的。文件中的每一项会作为PropertySources被添加到Spring Environment

如果你不想用"application"作为配置文件名称,可以在环境属性中通过spring.config.name来指定。还可以使用spring.config.location来显式指定配置文件的位置(文件路径或目录用逗号分隔)

注意,spring.config.name 和 spring.config.location 必须定义为一个环境属性(通常是一个OS环境变量、一个系统属性或一个命令行参数)

如果 spring.config.location 指定的是一个目录,那么必须以 / 结尾

无论直接指定文件还是包含在目录中,配置文件必须在其名称中包含文件扩展名。通常,扩展名支持 .properties, .yaml, .yml

举个栗子

指定单个文件

$ java -jar myproject.jar --spring.config.name=myproject

指定多个位置

$ java -jar myproject.jar --spring.config.location=optional:classpath:/default.properties,optional:classpath:/override.properties

默认情况下,如果指定的位置不存在,则会报错。如果你不确定它是否存在,使用使用 optional: 前缀

例如:

optional:classpath:/custom-config/,optional:file:./custom-config/

Profile Specific Files

Spring Boot 会尝试加载按照命名规约 application-{profile} 的文件,我们把这样的文件称为Profile-specific文件。

例如,如果你激活了一个名称为prod的profile,并且使用YAML文件,那么 application.yml 和 application-prod.yml 都会被尝试加载。

Profile-specific文件必须要和application.properties在相同的位置,而且profile-specific文件中的配置项会覆盖非profile-specific文件中相同的配置项。如果有多个profile-specific文件被激活,则后面会覆盖前面的。

举个例子,假设spring.profiles.active=prod,live,那么application-prod.properties中的配置项会被application-live.properties中的同名配置项覆盖。如果没有明确指定激活哪个profile,则application-default会被考虑激活。

YAML 文件

考虑下面的配置文件

hello:
world: "hehe" my:
roles:
- "admin"
- "guest"

转换成properties文件应该是:

hello.world=hehe
my.roles[0]=admin
my.roles[1]=guest

Spring Framework提供了两个方便的类,可以用来加载YAML文档。YamlPropertiesFactoryBean 将 YAML 作为 Properties 加载,而 YamlMapFactoryBean 将 YAML 作为一个 Map 加载。

可以用@Value注解将属性值注入到bean中

@Value("${hello.world}")
private String wahaha; @Value("${my.roles[1]}")
private String roles1;

划重点

1、支持四种外部配置源:Java属性文件、YAML文件、环境变量、命令行参数;
2、配置文件查找位置,依次为:
  (1) classpath 根路径
  (2) classpath 根路径下config目录
  (3) jar包当前目录
  (4) jar包当前目录的config目录
  (5) /config子目录的直接子目录
3、配置文件加载顺序:
  (1) 当前jar包内部的application.properties和application.yml
  (2) 当前jar包内部的application-{profile}.properties 和 application-{profile}.yml
  (3) 引用的外部jar包的application.properties和application.yml
  (2) 引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml
4、后面的可以覆盖前面的同名配置项

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-files

Spring Boot 加载外部配置文件的更多相关文章

  1. spring boot 加载application配置文件

    这就要注意了

  2. Spring Boot加载配置文件

    问题1:Spring如何加载配置,配置文件位置? 1.默认位置: Spring Boot默认的配置文件名称为application.properties,SpringApplication将从以下位置 ...

  3. Spring Boot加载application.properties配置文件顺序规则

    SpringApplication会从以下路径加载所有的application.properties文件: 1.file:./config/(当前目录下的config文件夹) 2.file:./(当前 ...

  4. springboot加载外部配置文件

    网上搜集和整理如下(自己已验证过) 1. war包在tomcat中加载外部配置文件 war包运行在独立tomcat下时,如何加载war包外部配置application.properties,以达到每次 ...

  5. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  6. 19、属性赋值-@PropertySource加载外部配置文件

    19.属性赋值-@PropertySource加载外部配置文件 加载外部配置文件的注解 19.1 [xml] 在原先的xml 中需要 导入context:property-placeholder 声明 ...

  7. spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...

  8. Spring如何加载log4j配置文件

    今天有朋友在群里问了这个问题,于是写了这篇文章进行整理. 问题如下: 在项目中添加了log4j.properties配置文件,并没有在Spring配置文件中配置,也没有在web.xml中配置,但是代码 ...

  9. 脚本命令加载外部配置文件夹conf

    加载log4j配置文件 Log4iConfigurer类 public class Log4iConfigurer { private static boolean INITIALIZED = fal ...

  10. spring boot加载配置文件的顺序

    四个默认加载配置文件地方的优先级,四个文件相同配置有优先级概念  不同位置相互补充 外部配置文件不建议使用,不符合maven项目结构,打包会打不进去

随机推荐

  1. java - 类属性 初始化的三种形式及顺序

    package chushihua; public class Hello { public static String name = getValue("属性"); { name ...

  2. Laravel - 模板中的url

    <!-- 1, url --> <a href="{{url('/')}}">跳转到主页</a>   <!-- 2,action  方法  ...

  3. 处理命令行main函数args参数

    引用 System.CommandLine 库(需要显示预览版才能看到) var fileOption = new Option<FileInfo?>( name: "--fil ...

  4. 【中介者模式(Mediator)】使用Java实现中介者模式

    引言 中介者,何为中介者,顾名思义就是我们的在处理A和B之间的关系的时候,引入一个中间人,来处理这两者之间的关系,例如生活中我们需要去租房,买房,都会有中介,来处理房东和租客之间的协调关系,这个就是中 ...

  5. [转帖]Kubernetes1.25.6部署文档 使用cri-docker部署K8s1.25.6

    https://zhuanlan.zhihu.com/p/600808149 本文档将通过kubeadm+docker部署K8s集群,本次集群使用的容器运行工具为docker,K8s的容器运行工具也可 ...

  6. [转帖]GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强

    GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强 https://www.cnblogs.com/05-hust/p/14515686.html 一 ...

  7. rclone 的下载地址-官方网站

    Downloads Rclone is single executable (rclone, or rclone.exe on Windows) that you can simply downloa ...

  8. [转帖]Nginx应用调优案例

    https://bbs.huaweicloud.com/blogs/146367 [摘要] 1 问题背景nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优 ...

  9. [转帖]Docker限制容器的资源

      docker在默认运行容器的情况下,是不会对运行的容器进行资源限制的,在自己的实验环境的话是随便你怎么弄的,不过在生产中是一定会对docker运行的容器进行资源限制的,如果不限制的话在生产中会带来 ...

  10. [转帖]美国出口管制条例(EAR)简介

    https://zhuanlan.zhihu.com/p/87962305 第一节.美国出口管制法律体系 下述一系列法律.法规及规则,构成美国完整的出口管理制度,是美国各相关执法部门执法的主要法律依据 ...