zoukankan      html  css  js  c++  java
  • SpringBoot(3)—配置文件详解:Properties和YAML

    一、配置文件优先级加载机制

      SpringBoot项目启动会扫描以下位置的application.properties或者application.yml作为默认的配置文件

        1、工程根目录:./config/

        2、工程根目录:./

        3、classpath:/config/

        4、classpath:/

      加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖低优先级的内容,形成互补配置

      PS:不过需要注意的是在工程根路径下或者根路径的config下面的配置文件,在工程打包时候不会被打包进去(这也可能和项目级别有关系,Module级别与IDEA中Project级别的,待验证,未实操)。  

      我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:

    private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
    

      接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。

      (1)我们也可以通过制定配置spring.config.location来改变默认配置,一般在项目已经打包后,我们可以通过以下指令来加载外部的配置 

    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

      (2)另外也可以通过命令行参数进行配置

        (a)所有的配置都可以在命令行上进行指定

        (b)多个配置用空格分开;--配置项=值

    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar 
    --server.port=8087 --server.context-path=/abc

      (3)以下优先级从高到低加载顺序:

        (a)命令行参数

        (b)来自java:comp/env的JNDI属性

        (c)Java系统属性(System.getProperties())

        (d)操作系统环境变量

        (e)RandomValuePropertySource配置的random.*属性值

        (f)jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

        (g)jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

        (h)jar包外部的application.properties或application.yml(不带spring.profile)配置文件

        (i)jar包内部的application.properties或application.yml(不带spring.profile)配置文件

          备注:由jar包外想jar包内进行寻找,优先加载带profile的,再加载不带profile的

        (j)@Configuration注解类上的@PropertySource

        (k)通过SpringApplication.setDefaultProperties指定的默认属性

    二、properties配置优先级>YAML配置优先级

      SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。
    以设置应用端口为例
      properties文件示例(application.properties):

    server.port=80

      YAML文件示例(application.yml):

    server:
      port: 80

      备注:在同一目录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置。

      yml类型的写法:冒号后要加个空格  

    三、@PropertySource和@ImportResource

      通常情况下我们将配置配置在application开头的主配置文件中,这样随着项目的增大配置项的增多会使文件变得非常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提供了**@PropertySource和@ImportResource**两个注解用于加载外部配置文件使用。

    • @PropertySource通常用于属性加载配置文件,注意@PropertySource注解不支持加载yaml文件,支持properties文件。
    • @ImportResource通常用于加载Spring的xml配置文件

      1、@propertySource使用

        (1)装配properties配置文件

        在sources/config下创建一个yaml文件命名为user.properties内容与上方user的配置一样

        

    @PropertySource(value = {"classpath:config/user.properties"})
    @Component
    @ConfigurationProperties(prefix = "user")
    public class Login{
    private String username;
    private String password;
    ...
    }

        (2)同时加载多个配置问题

      细心的你,会发现@PropertySource注解中属性value为一个数组,如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,那么Spring会识别哪一个呢?

    带着疑问,我们可以通过控制变量法进行测试,具体过程再在赘述。

    @PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})

      结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。

        (3)配yaml配置文件

      如果你有强迫症,一定想加载yaml配置文件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml文件,将原来的user.properties改成user.yaml,Bean配置类中加入如下代码,Login配置类和一开始的方式一致。

    @Bean
    public static PropertySourcesPlaceholderConfigurer loadProperties() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        //yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路径引入
        yaml.setResources(new ClassPathResource("config/user.yml"));//class路径引入
        configurer.setProperties(yaml.getObject());
        return configurer;
    }

      运行一下,仍然可以能达到加载配置效果的。

      2、@ImportResource使用

      SpringBoot提出零xml的配置,因此SpringBoot默认情况下是不会主动识别项目中Spring的xml配置文件。为了能够加载xml的配置文件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置文件,通常加于启动类上。

    @ImportResource(value = {"classpath:/beans.xml"})
    @SpringBootApplication(scanBasePackages = {"team.seagull.client"})
    public class DeployApplication {
        public static void main(String[] args) {
            SpringApplication.run(DeployApplication.class, args);
        }
    }

    四、多环境配置

      1、多环境配置的好处

        (1)不同环境配置可以配置不同的参数

        (2)便于部署,提高效率,减少出错

      2、properties多环境配置

        (1)配置激活选项

          spring.profiles.active=dev

        (2)添加其他配置文件

          

       3、YAML多环境配置

        (1)配置激活选项

    spring: 
        profiles: 
            active: dev       

        (2)在配置文件添加三个英文状态下的短横线即可区分

    ---
    spring: 
        profiles: dev

      4、两种配置方式的比较

        (1)Properties配置多环境,需要添加多个配置文件,YAML只需要一个配件文件

        (2)书写格式的差异,yaml相对比较简洁,优雅

        (3)YAML的缺点:不能通过@PropertySource注解加载。如果需要使用@PropertySource注解的方式加载值,那就要使用properties文件。

      5、如何使用

    java -jar myapp.jar --spring.profiles.active=dev

    五、一般配置文件方案参考

      我在自己的springboot项目中使用了多个配置文件,

      application.properties是主配置文件,放一些项目通用的配置;

      application-dev.properties 放的是平常开发的一些配置,比如说数据库的连接地址、帐号密码等;

      application-prod.properties 放的是生产环境的一些配置,比如说数据库的连接地址、帐号密码等。

      当然也可以再多一个application-test.properties ,放一些测试环境需要用到的参数。

      

      可以通过在application.properties 中设置spring.profiles.active=prod或者dev来使用application-dev.properties或者application-prod.properties文件,当然test文件也是同理。

  • 相关阅读:
    core 3.7.1 报错 SDK.InvalidRegionId : Can not find endpoint to access.
    定时30分钟清除缓存,重置
    文件的分割与合并
    mybatis <collection property="GoodsList" column="orderId" javaType="java.util.List" ofType="ui.model.vo.GoodsList" select="selectOrderDetail" fetchType="eager"/>
    hashMap 源码注释分析(二)
    hashMap 源码注释分析(一)
    ElasticSearch 入门
    Java 三高 ,高并发 ,高可用 。高性能
    使用MyBatis返回map对象,字段值为null时不返回或返回null,目标返回自定义的默认值...
    idea html 中文乱码,控制台中文乱码,工程文件中文乱码
  • 原文地址:https://www.cnblogs.com/javahr/p/12611617.html
Copyright © 2011-2022 走看看