Spring Boot
使用一个非常特殊的PropertySource
顺序,旨在允许合理的值重写,越靠前优先级越高。属性按以下顺序考虑:
- 开发者工具
Devtools
全局配置参数
在IDEA
或Eclipse
中,安装并启用Spring Boot Devtools
插件。打开项目的Settings
(或Preferences
),在Build, Execution, Deployment
下面的Compiler
中找到Build process VM options
, 在后面的文本框中输入devtools
全局配置参数(如:-Dspring.devtools.restart.pollInterval=3000
)即可。
- 单元测试上的
@TestPropertySource
注解指定的参数
在测试类中使用@TestPropertySource
注解指定测试时使用的配置文件(如:@TestPropertySource(locations = "classpath:test.properties")
)。
- 单元测试上的
@SpringBootTest
注解指定的参数
在SpringBoot
测试类中使用@SpringBootTest
注解指定测试时使用的配置文件和其他的属性(如:@SpringBootTest(properties = {"test.name=test", "test.age=18"})
)。
- 命令行指定的参数,如
java -jar springboot.jar --name="xxx"
在命令行中启动应用程序时,指定需要覆盖的属性参数(如:java -jar springboot.jar --name="xxx"
)。
- 命令行中的
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
)。
ServletConfig
初始化参数
在Servlet
的初始化方法中,使用getInitParameter
方法获取参数(如:String name = config.getInitParameter("name")
)。
ServletContext
初始化参数
在Servlet
的初始化方法中,使用getServletContext().getInitParameter
方法获取参数(如:String name = config.getServletContext().getInitParameter("name")
)。
JNDI
参数(如java:comp/env/spring.application.json
)
使用JNDI API
来获取参数,如:InitialContext context = new InitialContext(); String name = (String) context.lookup("java:comp/env/spring.application.json");
Java
系统参数(来源:System.getProperties()
)
使用System.getProperties()
方法来获取Java
系统参数(如:String name = System.getProperties().getProperty("name")
)。
- 操作系统环境变量参数
使用System.getenv()
方法来获取操作系统环境变量参数(如:String name = System.getenv("name")
)。
RandomValuePropertySource
随机数,仅匹配:ramdom.*
在配置文件中使用以random.
开头的属性名称,Spring Boot
会自动替换该属性的值为对应的随机数。
JAR
包外面的配置文件参数(application-{profile}.properties/yaml
)
在项目的配置文件夹下新建对应的配置文件(如:application-dev.properties
),并在该文件中设置需要的属性信息。
JAR
包里面的配置文件参数(application-{profile}.properties/yaml
)
在JAR
包内部,新建resources
文件夹,然后在该文件夹下新建对应的配置文件(如:application-prod.properties
)。
JAR
包外面的配置文件参数(application.properties/yaml
)
在项目的配置文件夹下新建application.properties
或application.yaml
文件,并在该文件中设置需要的属性信息。
JAR
包里面的配置文件参数(application.properties/yaml
)
在JAR
包内部,新建resources
文件夹,然后在该文件夹下新建application.properties
或application.yaml
文件,并在该文件中设置需要的属性信息。
@Configuration
配置文件上@PropertySource
注解加载的参数
在@Configuration
注解的Java
类上,添加@PropertySource
注解指定属性文件的路径(如:@PropertySource("classpath:test.properties")
)。
- 默认参数(通过
SpringApplication.setDefaultProperties
指定)
在启动Spring Boot
应用程序时,通过SpringApplication.setDefaultProperties
指定默认的配置属性(如:SpringApplication.setDefaultProperties(Collections.singletonMap("name", "default"))
)。
常用的方式有如下几种:
springboot
的4级配置文件
1级:file
:./config/application.yml
【最高】
2级:file
:./application.yml
3级:classpath
:config/application.yml
4级:classpath
:application.yml
【最低】
作用:
-
1级与2级留做系统打包后设置通用配置,1级通常用于运维经理进行线上整体项目部署方案调控
-
3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
配置文件 yml
、yaml
、properties
当properties
、yaml
和yml
三种文件路径相同时,三个文件中的配置信息都会生效,但是当三个文件中有配置信息冲突时,加载顺序是:
1级:properties
文件 【最高】
2级:yml
文件
3级:yaml
文件 【最低】
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