首页 > 其他分享 >SpringBoot 配置文件加载优先级

SpringBoot 配置文件加载优先级

时间:2023-05-10 15:14:10浏览次数:49  
标签:优先级 name 配置文件 jar application 参数 yml SpringBoot

我们在使用springboot开发的时候,经常会从外部获取属性值,为了记住这些规则,特此做如下记录~~~

一、为什么要做外部化配置

  1. 本地开发的时候,上传文件的时候,每个人想上传的路径不一样,使用外部配置,就可以单独设置自己的上传路径
  2. 项目部署的时候,不同的环境使用不同的配置,使用外部挂载配置这样我们就可以为每个环境单独设置一份配置。

二、springboot官方的解释

官方地址

  Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use properties files, YAML files, environment variables, and command-line arguments to externalize configuration. Property values can be injected directly into your beans by using the @Value annotation, accessed through Spring’s Environment abstraction, or be bound to structured objectsthrough @ConfigurationProperties.

  Spring Boot uses a very particular PropertySource order that is designed to allow sensible overriding of values. Properties are considered in the following order:

​ Spring Boot允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML文件、环境变量和命令行参数来具体化配置。属性值可以通过使用@Value注释直接注入到bean中,通过Spring的环境抽象进行访问,或者通过@ConfigurationProperties绑定到结构化对象。

​ Spring Boot使用一个非常特殊的PropertySource顺序,旨在允许合理的值重写。属性按以下顺序考虑:

  1. 开发者工具 Devtools全局配置参数

在IDEA或Eclipse中,安装并启用Spring Boot Devtools插件。打开项目的Settings(或Preferences),在Build, Execution, Deployment下面的Compiler中找到Build process VM options, 在后面的文本框中输入 devtools 全局配置参数(如:-Dspring.devtools.restart.pollInterval=3000 )即可。

  1. 单元测试上的@TestPropertySource注解指定的参数

在测试类中使用@TestPropertySource注解指定测试时使用的配置文件(如:@TestPropertySource(locations = "classpath:test.properties"))。

  1. 单元测试上的@SpringBootTest注解指定的参数

在SpringBoot测试类中使用@SpringBootTest注解指定测试时使用的配置文件和其他的属性(如:@SpringBootTest(properties = {"test.name=test", "test.age=18"}))。

  1. 命令行指定的参数,如java -jar springboot.jar --name="xxx"

在命令行中启动应用程序时,指定需要覆盖的属性参数(如:java -jar springboot.jar --name="xxx")。

  1. 命令行中的SPRING_APPLICATION_JSON指定参数,如java -Dspring.application.json='{"name":"xxx"}' -jar springboot.jar

在命令行中启动应用程序时,使用SPRING_APPLICATION_JSON来传递JSON格式的参数(如:java -Dspring.application.json='{"name":"xxx"}' -jar springboot.jar)。

  1. ServletConfig初始化参数

在Servlet的初始化方法中,使用getInitParameter方法获取参数(如:String name = config.getInitParameter("name"))。

  1. ServletContext初始化参数

在Servlet的初始化方法中,使用getServletContext().getInitParameter方法获取参数(如:String name = config.getServletContext().getInitParameter("name"))。

  1. JNDI参数(如java:comp/env/spring.application.json)

使用JNDI API 来获取参数,如:InitialContext context = new InitialContext(); String name = (String) context.lookup("java:comp/env/spring.application.json");

  1. Java系统参数(来源:System.getProperties())

使用System.getProperties()方法来获取Java系统参数(如:String name = System.getProperties().getProperty("name"))。

  1. 操作系统环境变量参数

使用System.getenv()方法来获取操作系统环境变量参数(如:String name = System.getenv("name"))。

  1. RandomValuePropertySource随机数,仅匹配:ramdom.*

在配置文件中使用以"random."开头的属性名称,Spring Boot会自动替换该属性的值为对应的随机数。

  1. JAR包外面的配置文件参数(application-{profile}.properties/yaml)

在项目的配置文件夹下新建对应的配置文件(如:application-dev.properties),并在该文件中设置需要的属性信息。

  1. JAR包里面的配置文件参数(application-{profile}.properties/yaml)

在JAR包内部,新建resources文件夹,然后在该文件夹下新建对应的配置文件(如:application-prod.properties)。

  1. JAR包外面的配置文件参数(application.properties/yaml)

在项目的配置文件夹下新建application.properties或application.yaml文件,并在该文件中设置需要的属性信息。

  1. JAR包里面的配置文件参数(application.properties/yaml)

在JAR包内部,新建resources文件夹,然后在该文件夹下新建application.properties或application.yaml文件,并在该文件中设置需要的属性信息。

  1. @Configuration配置文件上@PropertySource注解加载的参数

在@Configuration注解的Java类上,添加@PropertySource注解指定属性文件的路径(如:@PropertySource("classpath:test.properties"))。

  1. 默认参数(通过SpringApplication.setDefaultProperties指定)

在启动Spring Boot应用程序时,通过SpringApplication.setDefaultProperties指定默认的配置属性(如:SpringApplication.setDefaultProperties(Collections.singletonMap("name", "default")))。

我们常用的方式有如下几种:

  • calsspath类路径下的配置文件
. project-sample  
├── config  
│   ├── application.yml (4)  
│   └── src/main/resources  
|   │   ├── application.yml (1)  
|   │   └── config  
|   |   │   ├── application.yml (2)  
├── application.yml (3)  
 
注:src/main/resources下的配置文件在项目编译时,会放在target/classes下  

启动时加载配置文件顺序1 -> 2 -> 3 -> 4,优先级 4 > 3 > 2 > 1

  • idea中指定配置文件--spring.config.location

Configurations中的Program arguments指定加载外部配置文件,使用--spring.config.location指定/yml/application.yml下的文件

  • java -jar 命令指定配置文件java -jar -Dspring.config.location或者属性java -jar springboot.jar --name="xxx"

比如说,我们使用docker部署项目的时候,我们可以使用java -jar -Dspring.config.location=/admin/yml/application.yml指定加载外部的配置,而不使用jar里面的

docker run --privileged -d -p 58070:8799  --name cic-admin openjdk:11  java -jar -Dspring.config.location=/admin/yml/application.yml -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08  /admin/jar/cic-admin.jar
  • JAR包外面的配置文件

其中文件结构如下:

├── config  
│   ├── application.yml (2)  
├── application.yml (1)
├── springbootDemo-0.0.1-SNAPSHOT.jar

当我们执行java -jar springbootDemo-0.0.1-SNAPSHOT.jar会使用config目录下的yml文件,如果config下不存在,则使用jar同级的文件

三、参考文章

SpringBoot 配置文件加载优先级

标签:优先级,name,配置文件,jar,application,参数,yml,SpringBoot
From: https://www.cnblogs.com/zjmByte/p/17386992.html

相关文章

  • SpringBoot定义优雅全局统一Restful API 响应框架四
    如果没有看前面几篇文章请先看前面几篇SpringBoot定义优雅全局统一RestfulAPI响应框架SpringBoot定义优雅全局统一RestfulAPI响应框架二SpringBoot定义优雅全局统一RestfulAPI响应框架三目前我们好像似乎解决所有问题,达到了我们理想的效果如下但是在业务错误返回时候......
  • SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)
    场景SpringBoot搭建的项目需要对开放的接口进行防刷限制,不同接口指定多少秒内可以请求指定次数。比如下方限制接口一秒内最多请求一次。 注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、实现思路首先自定义注解,添加时间区间和最大请求次数字段。然后自定义......
  • 关于arcgis和postgresql数据库创建企业级地理数据库的配置文件
    第一:需要将arcgis的C:\ProgramFiles(x86)\GeoScene\Desktop\Desktop10.8\DatabaseSupport\PostgreSQL\12\Windows64这个路径下的文件拷贝到postgresql数据库的安装目录的lib文件夹中;第二:需要将五个文件libeay32.dll、libiconv-2.dll、libintl-8.dll、libpq.dll和ssleay32.d......
  • Springboot创建多module项目--转载
    1)createnewproject(或File-->new-->project)2)选中SpringInitializr,点击Nextimage.png3)填写必要信息,点击Nextimage.png4)依赖页不用勾选,点击Nextimage.png5)选择项目存储目录,点击Finishimage.png6)在pom.xml中加入packaging......
  • springboot alibaba druid数据库连接池配置,输出可执行sql
    #数据源配置spring:datasource:type:com.alibaba.druid.pool.DruidDataSourcedruid:#初始连接数initialSize:5#最小连接池数量minIdle:2#最大连接池数量maxActive:50#配置获取连接等待超时的时间......
  • Springboot-hbase增删改20230509
    1、启动 2、ZK客户端    3、springboot+hbase实例1)、pom<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&......
  • MyBatis逆向工程配置文件及一些配置解释(跑通)
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.d......
  • SpringBoot - 参数接收方式
    SpringBoot-参数接收方式·前言·使用@PathVariable接收路径中的参数·使用@RequestParam获取路径中?后的参数·使用@RequestBody获取Map对象·使用@RequestBody获取实体对象前言使用@PathVariable接收路径中的参数@GetMapping(value="/param/{id}")publicStri......
  • springBootMVC搭建
    springBootMVC搭建 分类专栏:spring环境配置spring环境配置专栏收录该内容17篇文章0订阅订阅专栏今天给大家介绍一下springBootMVC,让我们学习一下如何利用SpringBoot快速的搭建一个简单的web应用。环境准备一个称手的文本编辑器(例如Vim、Emacs、SublimeText)或者I......
  • SpringBoot的@Configuration注解
    本文主要讲述SpringBoot的@Configuration注解。一.POJO类的声明例如有两个pojo类,分别是User和PetUser类的声明如下:publicclassUser{privateStringname;privateIntegerage;publicUser(){}publicUser(Stringname,Integer......