SpringBoot Profiles(Profile分组、Profile配置文件)、外部化配置

发布时间:2023年12月25日

1. profiles

环境隔离能力;快速切换开发、测试、生产环境

步骤:

  1. 标识环境:指定哪些组件、配置在哪个环境生效
  2. 切换环境:让这个环境对应的所有组件和配置生效

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的组件永远都激活
  • 激活方式:
    1. application.properties配置文件激活指定环境:spring.profiles.active=dev,test
    2. 也可以使用命令行Program arguments激活:--spring.profiles.active=dev,test
  • 未激活环境,可以配置默认环境,默认的环境是default。可以通过spring.profiles.default=dev进行修改。不推荐使用默认环境

注意:spring.profiles.activespring.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属性源加载顺序。配置不同就都生效(互补)。相同配置优先级由低到高,高优先级配置覆盖低优先级

  1. 默认属性(通过自定义SpringApplication指定。通过.properties("key1=value1","key2=value2").properties(map)传递SpringBoot所有配置参数
  2. @PropertySource("classpath:my.properties")指定加载的配置(需要写在@Configuration类上才可生效)。或通过配置参数spring.config.import=classpath:my.properties导入额外配置
  3. 配置文件(application.properties等)
  4. RandomValuePropertySource支持的random.*配置(如:@Value(“${random.int}”))
  5. OS环境变量
  6. Java系统属性(System.getProperties())
  7. JNDI属性(来自java:comp/env)
  8. ServletContext初始化参数
  9. ServletConfig初始化参数
  10. SPRING_APPLICATION_JSON属性(内置在环境变量或系统属性中的JSON)
  11. 命令行参数。会被添加到环境变量
  12. 测试属性(@SpringBootTest进行测试时指定的属性)
  13. 测试类@TestPropertySource注解
  14. Devtools设置的全局属性($HOME/.config/spring-boot)

配置文件优先级如下:(后面覆盖前面)

  1. jar包内
    1. classpath
      1. application.properties
      2. application-{profile}.properties
    2. classpath:/config
      1. application.properties
      2. application-{profile}.properties
  2. jar包所在文件夹
    1. application.properties
      1. 当前路径
      2. 当前路径\config
      3. 当前路径\config\xxx
    2. application-{profile}.properties
      1. 当前路径
      2. 当前路径\config
      3. 当前路径\config\xxx

注意:

  • 如果.properties和.yml配置文件同时存在,则.properties优先级高
  • application.properties中可以使用key2=${key1:defaultValue}_test,进行参数的获取拼接
  • 可以在类中,使用注入的方式@Value("${key2:defaultValue}"),获取application.properties的配置参数值
文章来源:https://blog.csdn.net/yy8623977/article/details/131880978
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。