外部配置优先级

Externalized Configuration

  • Spring Boot允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java属性文件、YAML文件、环境变量和命令行参数。

  • 属性值可以通过使用@Value注释直接注入到bean中,通过Spring的环境抽象进行访问,或者通过@ConfigurationProperties绑定到结构化对象。

  • Spring Boot使用一个非常特殊的PropertySource顺序,旨在允许合理的值重写。以后的属性源可以覆盖在以前的属性源中定义的值。来源按下列顺序审议:参考官网地址
    在这里插入图片描述
    解释:

  1. 默认属性(通过设置SpringApplication.setDefaultProperties指定)。
  2. @PropertySource注释在你的@Configuration类上。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到环境中。这对于配置某些属性(如日志记录)来说太晚了。*和spring.main。*在刷新开始前读取。
  3. 配置数据(如应用程序)。属性文件)。
  4. RandomValuePropertySource只具有random.*中的属性。
  5. 操作系统环境变量。
  6. Java系统属性(System. getproperties())。
  7. 来自java:comp/env的JNDI属性。
  8. ServletContext初始化参数。
  9. ServletConfig初始化参数。
  10. 来自SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)。
  11. 命令行参数。
  12. 属性。可以在@SpringBootTest和测试注释中获得,用于测试应用程序的特定部分。
  13. 测试中的@DynamicPropertySource注释。
  14. 测试上的@TestPropertySource注释。
  15. Devtools的全局设置属性在$HOME/。devtools处于活动状态时,配置/spring-boot目录。

配置数据文件按以下顺序考虑:

  1. 打包在jar(应用程序)中的应用程序属性。属性和YAML变体)。(classpath:application.yml )
  2. 打包在jar中的特定于配置文件的应用程序属性(application-{profile})。属性和YAML变体)。classpath:config/application.yml
  3. 包中的jar(应用程序)之外的应用程序属性。属性和YAML变体)。(file :application.yml)
  4. 包中的jar之外的特定于配置文件的应用程序属性(application-{profile})。属性和YAML变体)。(file :config/application.yml )
    重复就看优先级,优先级高覆盖优先级低的;
    不重复则合并

案例

  1. 通过设置SpringApplication.setDefaultProperties指定
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
@SpringBootApplication
public class Springboot08SsmpApplication {
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(Springboot08SsmpApplication.class);
        Properties properties = new Properties();
        properties.put("spring.profiles.active", "dev");
        springApplication.setDefaultProperties(properties);
        ConfigurableApplicationContext run = springApplication.run(args);
        ConfigurableEnvironment env = run.getEnvironment();
        System.out.println("====================");
        System.out.println(env);
        System.out.println("==================");
        System.out.println(env.getProperty("spring.datasource.druid.driver-class-name"));
        System.out.println("==================");
        System.out.println(env.getProperty("server.port"));
    }
}

在这里插入图片描述

说明

在启动类还是在其他类中获得的env对象都是一样的,env对象是依据各种配置优先级后的封装对象,它里面的属性就是最终程序运行时的参数。
spring.profiles.default含义:设置激活的环境就按照激活的环境,没有设置激活的环境就选择自己设置的默认dev。
如果自己在yml中设置了该属性,因为yml的优先级比这个大,所以yml覆盖此处的设置。
如果自己在yml中没有设置该属性,此处的设置会起作用。
这些设置都是通过内部bean,有一个Environment对象,不是通过主启动类中的args。
2. Java System
在这里插入图片描述
在这里插入图片描述
3. 命令行参数

java –jar springboot.jar –-spring.profiles.active=pro

在这里插入图片描述
在这里插入图片描述

  • 临时属性通过主启动类中args加载
  • 使用jar命令启动SpringBoot工程时可以使用临时属性替换配置文件中的属性
  • 临时属性添加方式:java –jar 工程名.jar –-属性名=值
  • 多个临时属性之间使用空格分隔
  • 临时属性必须是当前boot工程支持的属性,否则设置无效.
  1. 临时属性设置(开发环境)
    带属性启动SpringBoot程序,为程序添加运行属性
    在这里插入图片描述
    通过编程形式带参数启动SpringBoot程序,为程序添加运行参数。args就是用来接收传过来的参数,和命令行参数一样也是通过主启动类中args加载。我们也可以不使用传过来的args,自己手动配置arg,达到同样的效果,这样的话就算通过外部传的参数也不加载,参数不起作用,因为使用的是arg,而不是args。
    在这里插入图片描述
  2. 不携带参数启动SpringBoot程序(接收外部传的参数但是不携带参数启动)
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值