美文网首页Spring Boot实践记录后端相关微服务框架学习
SpringBoot 入门篇(五) SpringBoot的配置文

SpringBoot 入门篇(五) SpringBoot的配置文

作者: rm杠rf | 来源:发表于2018-06-20 22:32 被阅读93次

    一、SpringBoot的yml配置文件

    二、SpringBoot配置文件优先级

    三、Profile-specific配置文件

    SpringBoot版本:1.5.13.RELEASE
    对应官方文档链接:https://docs.spring.io/spring-boot/docs/1.5.13.RELEASE/reference/htmlsingle/

    上一篇:SpringBoot 入门篇(四) SpringBoot外部配置以及优先级


    一、SpringBoot的yml配置文件

      SpringBoot的配置文件常用的有2种类型,.properties和.yml。默认情况下,SpringBoot会加载classpath或者classpath:/config下的application.properties或者application.yml文件。

      .properties文件是我们常用的配置文件,.yml则是YAML文件,YAML是一种易阅读、易和脚本语言交互的用来表达资料序列的编程语言,这里简单说下语法
      (1)使用空格 Space 缩进分层,同层元素左对齐,不同层元素使用不同的空格数目缩进(不能使用 Tab,各系统 Tab对应的空格数目可能不同,导致层次混乱);
      (2)#表示注释;
      (3)破折号后面跟一个空格表示列表;
      (4)key和value之间用冒号和空格分隔。

    environments:
        dev:
            url: http://dev.bar.com
            name: Developer Setup
        prod:
            url: http://foo.bar.com
            name: My Cool App
    
    #yaml 的list集合
    my:
       servers:
           - dev.bar.com
           - foo.bar.com
    

      上述代码段是一个标准的yml文件内容,等价于如下properties配置

    environments.dev.url=http://dev.bar.com
    environments.dev.name=Developer Setup
    environments.prod.url=http://foo.bar.com
    environments.prod.name=My Cool App
    
    my.servers[0]=dev.bar.com
    my.servers[1]=foo.bar.com
    

      SpringBoot通过YamlPropertiesFactoryBean 来加载application.yml文件,并通过YamlMapFactoryBean 将其转换成Map。
      我们可以通过@Value或者@ConfigurationProperties注解来获取配置文件中的数据。例如有如下application.yml文件:

    name:
        nameStr
    age:
        11
    
    #yaml 的list集合
    my:
        servers:
           - dev.bar.com
           - foo.bar.com
    
    @Configuration
    public class MyConfiguration {
        // 通过@Value获取值
        @Value("${name}")
        private String name;
    
        @Value("${age}")
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    @Configuration
    //通过@ConfigurationProperties获取值
    @ConfigurationProperties(prefix="my")
    public class MyConfig {
    
        private List<String> servers = new ArrayList<String>();
    
        public List<String> getServers() {
            return this.servers;
        }
    
    }
    
    @SpringBootApplication
    @RestController
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication application = new SpringApplication(Application.class);
            application.run(args);
        }
    
    
        @Autowired
        private MyConfiguration myConfiguration;
    
        @RequestMapping("/getMyConfiguration")
        public String getMyConfiguration() {
            return myConfiguration.getName() + ":" + myConfiguration.getAge();
        }
    
        @Autowired
        private MyConfig myConfig;
    
        @RequestMapping("/getMyConfig")
        public List<String> getMyConfig() {
            return myConfig.getServers();
        }
    }
    

      启动Application,在浏览器分别输入 http://localhost:8080/getMyConfigurationhttp://localhost:8080/getMyConfig 可以得到配置的值。
      当使用@ConfigurationProperties获取配置值,SpringBoot还提供了一种宽松的绑定方式(@Value不支持该特性):

    @ConfigurationProperties(prefix="person")
    public class OwnerProperties {
    
        private String firstName;
    
        public String getFirstName() {
            return this.firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
    }
    

    则在配置文件中使用如下任意一种方式都能获取对应的配置值

    person.firstName
    person.first-name
    person.first_name
    PERSON_FIRST_NAME
    

    二、SpringBoot配置文件优先级

      默认情况下,SpringBoot会加载如下位置的配置文件,这些文件可以同时存在,当这些文件中的多个存在相同的key时,value的优先级从高到低分别为:
      (1)当前应用目录下/config子文件夹下的application.properties或者application.yml文件;
      (2)当前应用目录下的application.properties或者application.yml文件;
      (3)类路径下/config子文件夹下的application.properties或者application.yml文件;
      (4)类路径下的application.properties或者application.yml文件。
      如果想指定加载的配置文件,则可以通过在启动时添加命令行参数--spring.config.name或者--spring.config.location进行指定文件。

    $ java -jar app.jar --spring.config.name=myproject
    或者
    $ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
    

      需要注意的是,使用命令行参数指定的文件的优先级是最高的,例如如果通过命令行指定了应用目录下./custom-config/和classpath:/custom-config/,则value的优先级从高到低分别为:
      (3)当前应用目录下./custom-config路径下的application.properties或者application.yml文件;
      (4)类路径下子文件夹/custom-config/下的application.properties或者application.yml文件;
      (3)当前应用目录下/config子文件夹下的application.properties或者application.yml文件;
      (4)当前应用目录下的application.properties或者application.yml文件;
      (5)类路径下/config子文件夹下的application.properties或者application.yml文件;
      (6)类路径下的application.properties或者application.yml文件。


    三、Profile-specific配置文件

      SpringBoot除了会加载application.properties/yml外,还会加载application-{profile}.properties/yml,其中{profile}默认为default,也就是说,如果同时存在application.properties/yml和application-default.properties/yml,SpringBoot会同时加载它们,且application-default.properties/yml的优先级更高。
      我们也可以自定义{profile},需要注意,除了application-default.properties/yml外,application-{profile}.properties/yml文件在加载后会处于未激活状态,即其中的值无法使用,如果想使用,则需要在application.properties/yml中指定spring.profiles.active。
      例如,在工程中有如下3个文件,application-dev.yml表示开发使用的配置,application-test.yml表示测试使用的配置,application-pro.yml表示生产环境使用的配置,则我们通过在application.yml中指定spring.profiles.active的值为{profile}对应的值(即dev\test\pro),就可以灵活的修改对应配置,方便开发、测试和运维的同学使用不同的配置。

    spring:
        profiles:
            active:
                pro
    

      另外一种激活application-{profile}.properties/yml文件的方式是使用SpringApplication.setAdditionalProfiles()方法:

     public static void main(String[] args) {
            SpringApplication application = new SpringApplication(Application.class);
            application.setAdditionalProfiles("dev");
            application.run(args);
        }
    

    上一篇:SpringBoot 入门篇(四) SpringBoot外部配置以及优先级

    相关文章

      网友评论

        本文标题:SpringBoot 入门篇(五) SpringBoot的配置文

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