1. profiles
环境隔离能力;快速切换开发、测试、生产环境
步骤:
- 标识环境:指定哪些组件、配置在哪个环境生效
- 切换环境:让这个环境对应的所有组件和配置生效
1.1. 使用
1.1.1 指定环境
- Spring Profiles提供一种隔离配置的方式,使其仅在特定环境生效
- 任何@Component, @Configuration或@ConfigurationProperties等容器中的所有组件,都可以使用@Profile标记,来指定何时被加载。如
@Profile({"dev"})
- 在@Configuration注解的配置类中,使用@Bean添加的组件。如果给类注解
@Profile({"dev"})
,给方法注解@Profile({"test"})
,需要激活--spring.profiles.active=dev,test
才能将Bean添加到容器
1.1.2 环境激活
- 不标注@Profile的组件永远都激活
- 激活方式:
- application.properties配置文件激活指定环境:
spring.profiles.active=dev,test
- 也可以使用命令行Program arguments激活:
--spring.profiles.active=dev,test
- 未激活环境,可以配置默认环境,默认的环境是default。可以通过
spring.profiles.default=dev
进行修改。不推荐使用默认环境
注意:spring.profiles.active
和spring.profiles.default
只在application.properties生效,在application-dev.properties等profile配置文件无效
1.1.3 环境包含
指定一个环境,不管是否激活该环境,该环境都被激活
spring.profiles.include[0]=common
spring.profiles.include[1]=log
最佳实战:
- 生效的环境 = 包含的环境 + 激活的环境/默认环境
- 项目里面这么用
- 基础的配置mybatis、log、xxx:写到包含环境中
- 需要动态切换变化的db、redis:写到激活的环境中
1.2. Profile分组
创建group1组,指定包含dev和test环境
spring.profiles.group.group1[0]=dev
spring.profiles.group.group1[1]=test
或
spring.profiles.group.group1=dev,test
使用--spring.profiles.active=group1
,就会激活dev和test环境
1.3 Profile配置文件
- application-{profile}.properties可以作为指定环境的配置文件,如application-dev.properties。激活这个环境,这个环境的所有配置就会生效
- 最终生效的所有配置是:application.properties + 激活的application-{profile}.properties。如果配置参数冲突,激活的profile配置文件优先级高
- 如果同时激活多个配置文件。如
spring.profiles.include=dev,test
,多个配置文件都会生效,但相同参数冲突,则以后面的test为准
2. 外部化配置
2.1 场景
线上应用如何快速修改配置,并应用最新配置?
- SpringBoot使用外部配置 + 配置文件优先级简化配置更新、简化运维
- 只需要给jar应用所在的文件夹,或其config文件夹下,或其config文件夹下的一级文件夹下,放一个application.properties(也可以再放application-dev.propertiesd等)配置文件,重启项目就能自动应用最新配置
2.2 配置优先级
以下是SpringBoot属性源加载顺序。配置不同就都生效(互补)。相同配置优先级由低到高,高优先级配置覆盖低优先级
- 默认属性(通过自定义SpringApplication指定。通过
.properties("key1=value1","key2=value2")
或.properties(map)
传递SpringBoot所有配置参数 @PropertySource("classpath:my.properties")
指定加载的配置(需要写在@Configuration类上才可生效)。或通过配置参数spring.config.import=classpath:my.properties
导入额外配置- 配置文件(application.properties等)
- RandomValuePropertySource支持的random.*配置(如:@Value(“${random.int}”))
- OS环境变量
- Java系统属性(System.getProperties())
- JNDI属性(来自java:comp/env)
- ServletContext初始化参数
- ServletConfig初始化参数
- SPRING_APPLICATION_JSON属性(内置在环境变量或系统属性中的JSON)
- 命令行参数。会被添加到环境变量
- 测试属性(@SpringBootTest进行测试时指定的属性)
- 测试类@TestPropertySource注解
- Devtools设置的全局属性($HOME/.config/spring-boot)
配置文件优先级如下:(后面覆盖前面)
- jar包内
- classpath
- application.properties
- application-{profile}.properties
- classpath:/config
- application.properties
- application-{profile}.properties
- jar包所在文件夹
- application.properties
- 当前路径
- 当前路径\config
- 当前路径\config\xxx
- application-{profile}.properties
- 当前路径
- 当前路径\config
- 当前路径\config\xxx
注意:
- 如果.properties和.yml配置文件同时存在,则.properties优先级高
- application.properties中可以使用
key2=${key1:defaultValue}_test
,进行参数的获取拼接 - 可以在类中,使用注入的方式
@Value("${key2:defaultValue}")
,获取application.properties的配置参数值