美文网首页SpringBoot专题SpringBoot
SpringBoot入门建站全系列(二十三)配置文件优先级及自定

SpringBoot入门建站全系列(二十三)配置文件优先级及自定

作者: 逍遥天扬 | 来源:发表于2019-08-21 09:45 被阅读4次

    SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件

    一、概述

    Spring Boot允许多种配置来源,官网是这样说的:

    Spring Boot使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。按以下顺序考虑属性(优先级从高到低):

    1. Devtools 主目录上的全局设置属性(~/.spring-boot-devtools.properties当devtools处于活动状态时)。
    2. @TestPropertySource 你的测试注释。
    3. properties属性测试。可 用于测试特定应用程序片段@SpringBootTest的 测试注释。
    4. 命令行参数。
    5. 来自SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的内联JSON)的属性。
    6. ServletConfig init参数。
    7. ServletContext init参数。
    8. JNDI属性来自java:comp/env。
    9. Java系统属性(System.getProperties())。
    10. OS环境变量。
    11. RandomValuePropertySource,只有在拥有random.*属性。
    12. 特定于配置文件的应用程序属性在打包的jar(application-{profile}.properties和YAML变体)之外。
    13. 打包在jar中的特定于配置文件的应用程序属性(application-{profile}.properties 以及YAML变体)。
    14. 打包jar之外的应用程序属性(application.properties以及YAML变体)。
    15. 打包在jar中的应用程序属性(application.properties和YAML变体)。
    16. @PropertySource 在@Configuration类上的注释。
    17. 默认属性(由设置指定SpringApplication.setDefaultProperties)。

    事实上,这个地方还少了一个,那就是配置中心,配置中心的优先级是最高的,还可以动态刷新,可以参考《SpringCloud技术指南系列(八)配置管理之Consul配置中心》配置中心的使用。

    而且,我们常用的,一般有命令行参数、application-{profile}.properties和application.properties。自定义配置文件用的也不多,但是还是有人用的。

    本篇着重讲述下常用的配置方式。

    首发地址:
    品茗IT-同步发布

    Spring项目快速开发工具:

    一键快速构建Spring项目工具

    一键快速构建SpringBoot项目工具

    一键快速构建SpringCloud项目工具

    一站式Springboot项目生成

    Mysql一键生成Mybatis注解Mapper

    如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

    二、命令行参数

    默认情况下,SpringApplication将任何命令行选项参数(即,以--开头的参数,如--server.port=9000)转化为property,并将它们添加到spring Environment。如前所述,命令行属性始终优先于其他属性源。

    如果您不希望将命令行属性添加到Environment,则可以使用禁用它们SpringApplication.setAddCommandLineProperties(false)。

    三、主配置文件

    3.1 主配置常用配置

    SpringApplication从application.properties以下位置的文件加载属性并将它们添加到Spring Environment:(优先级从高往低)

    1. Jar包同级目录/config
    2. Jar包同级目录
    3. classpath 下的/config
    4. classpath根路径 /

    如果你不喜欢properties文件,可以使用YAML替代properties文件,加载顺序什么都是一样的,只不过写法不一样。
    下面是两种写法的不同:

    properties文件:

    server.port=8858
    spring.profiles.active=loc
    

    yaml文件

    server:
       port: 8812
    spring:
       profiles:
          active: loc
    

    yaml文件看起来简洁明了,properties文件看起来一坨一坨的,但是我更喜欢properties文件,因为yaml文件对语法要求严格,tab键和空格键入的内容都不一样,很容易出错。

    3.2 主配置替换

    这种配置方法很少使用,可以说基本上没人用。

    如果您不喜欢application.properties配置文件名,可以通过指定spring.config.name环境属性切换到另一个文件名。您还可以使用spring.config.location属性(以逗号分隔的目录位置或文件路径列表)来引用显式位置。spring.config.additional-location来指定额外配置文件。

    spring.config.name的作用就是给application.properties换个名。

    spring.config.location就是指定了加载配置文件的路径。就是不再从上面说的那个路径取配置文件。

    spring.config.additional-location就是指定了额外配置文件的加载路径。除了在上面的在默认位置搜索配置文件,还搜索这个配置指定的位置的配置文件。而且优先级最高。

    这三个配置都不能写在应用里,因为它是在应用启动前就确定的,需要在环境变量或者命令行参数确定。

    四、其他配置文件

    如果我们在application.properties中写入了太多配置,想用其他配置文件来写配置时,就需要考虑下如何加载这些配置文件。

    4.1 指定配置文件加载

    指定配置文件加载,就是指application-{profile}.properties和YAML变体 这种形式。

    一直以来,我一直对这种形式存在误解,以为它只能区分环境,后来才发现,自己错了,这个只是纯粹的指向新的配置文件,你指了哪个,哪个就能加载。下面说下它分别怎么用。

    区分环境:

    • 比如有三个环境的配置文件application-loc.properties,application-dev.properties,application-prod.properties,没有固定位置,只要放在Spring能加载的位置即可,一般放在application.properties的低一级目录,方便区分,比如application.properties放在classpath下,这些配置文件可以放在config/目录下。

    • 在命令行参数,或者application.properties中,使用spring.profiles.active=loc指定要来指定加载application-loc.properties配置文件。其他雷同。

    区分应用:

    • 比如我们有用到redis,我们想把redis的配置单独出去,不想放在application.properties里面变一坨。就可以单独新建配置文件application-redis.properties,放在Spring能加载的位置。

    • application.properties中(这个就没必要放命令行参数了,因为我们应用里面肯定要用到的),使用spring.profiles.active=loc,redis指定要来指定加载application-redis.properties配置文件。

    • 如果使用命令行参数传递的spring.profiles.active=loc,可能会覆盖掉配置文件中的redis配置,这时候,我们可以使用spring.profiles.include配置,叠加激活profile,如果配置spring.profiles.include=redis,指定spring.profiles.active=loc,就可以同时激活loc,redis,等同于spring.profiles.active=loc,redis。

    4.2 自定义配置文件加载

    自定义配置文件,就是定义的配置文件命名规范不再遵循Spring boot的要求,自由加载。需要使用@PropertySource注解加载配置文件。

    1. 先在classpath下建个配置文件,如user.properties。

    user.properties:

    user.username=cff
    user.realName=大爷
    user.mobile=23333
    hello.message=sssssssssssssssssssaasa
    
    1. 使用@PropertySource("classpath:user.properties")加载配置,同时使用@ConfigurationProperties自动绑定属性,当然也可以使用@Value来注入配置。

    代码示例:

    package cn.pomit.springbootwork.consulclient.service;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    @Configuration
    @ConfigurationProperties(prefix="user")
    @PropertySource("classpath:user.properties")
    public class UserConfig {
    
        private String userName;
    
        private String realName;
    
        private Integer mobile;
    
        private String message;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getRealName() {
            return realName;
        }
    
        public void setRealName(String realName) {
            this.realName = realName;
        }
    
        public Integer getMobile() {
            return mobile;
        }
    
        public void setMobile(Integer mobile) {
            this.mobile = mobile;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        @Override
        public String toString() {
            return "UserConfig [userName=" + userName + ", realName=" + realName + ", mobile=" + mobile + ", message="
                    + message + "]";
        }
    
    }
    
    

    这样就可以直接使用user.properties配置文件中的配置,这里有注意事项:

    • 只有@PropertySource,是不能加载配置的。

    • @ConfigurationProperties(prefix="user") 只绑定了user.开头的属性。

    • @Value 可以注入任何属性。

    • @ConfigurationProperties和@Value的不同是,@ConfigurationProperties支持属性绑定,@Value不行,但是@Value支持el表达式,@ConfigurationProperties不支持。

    五、Jar包外的配置文件

    1. Spring boot默认读取jar包当前目录下的application.properties配置文件,以及config下的application.properties文件。

    2. 也可以使用spring.config.location替换加载配置文件的路径。

    3. 也可以使用spring.config.additional-location来指定了额外配置文件的加载路径。

    4. 使用@PropertySource(value={"file:D:/test/user.properties"}) 这种形式,指定文件是D:/test目录下的user.properties文件。也可以把D:/test/写在配置文件中,如用out.profile.path=D:/test 指定,然后使用@PropertySource(value={"file:${out.profile.path}/user.properties"}) 来指定外部配置文件。

    品茗IT-博客专题:https://www.pomit.cn/lecture.html汇总了Spring专题Springboot专题SpringCloud专题web基础配置专题。

    快速构建项目

    Spring组件化构建

    SpringBoot组件化构建

    SpringCloud服务化构建

    喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot使用吧!


    品茗IT交流群

    相关文章

      网友评论

        本文标题:SpringBoot入门建站全系列(二十三)配置文件优先级及自定

        本文链接:https://www.haomeiwen.com/subject/nqavsctx.html