美文网首页
SpringBoot系列:2、配置

SpringBoot系列:2、配置

作者: 程序员小H | 来源:发表于2019-10-17 20:51 被阅读0次

    1、配置文件

    1.1 配置文件

    SpringBoot使用一个全局的配置文件

    • application.properties
    • application.yml
      配置文件的作用:修改SpringBoot自动配置的默认配置

    1.2 YAML

    • 标记语言
    • 以数据为中心,比json、xml等更适合做配置文件
    1.2.1 基本语法
    • k:(空格)v:表示一对键值对(空格必须有)
    • 以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的
    • 属性和值大小写敏感
    server:
      port: 8081
    
    1.2.2 值的写法
    • 字面量:普通的值(数字、字符串、布尔)

      • 字符串不用加上单引号或者双引号
      • “”:双引号,不回转义字符串里面的特殊字符,特殊字符会作为本身想要表示的意思
      name: "aa \n bb"
      输出:aa 换行 bb
      
      • ‘’:单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据
      name: 'aa \n bb'
      输出:aa \n bb
      
    • 对象、Map(属性和值)(键值对)

      • k: v 在下一行来写对象的属性和值的关系,注意缩进,对象还是k: v的方式
      person: 
                  firstName: zhang
                  lastName: san
                  age: 24
      行内写法
      person: {firstName: zhang, astName: san, age: 24}
      
    • 数组(List、Set)

      • 用-值表示数组中的一个元素
      animals: 
              - cat
              - dog
              - pig
      行内写法
      animals: [cat, dog, pig]
      

    2、读取配置文件

    2.1 第一种@ConfigurationProperties 方式

    application.yml文件内容

    person:
      lastName: xiaoH
      age: 29
      boss: false
      birth: 2019-10-16
      maps: {k1: v1, k2: v2}
      lists:
        - zhangsan
        - lisi
        - wangwu
      dog:
        name: 旺财
        age: 2
    

    Dog.java

    public class Dog {
    
        private String name;
        private Integer age;
          
            // 省略getter和setter方法
    }
    

    Person.java

    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    
        private String lastName;
        private Integer age;
        private Boolean boss;
        private Date birth;
    
        private Map<String, Object> maps;
        private List<Object> lists;
        private Dog dog;
    
        // 省略getter和setter方法
    }
    

    注意:使用@ConfigurationProperties(prefix = "person")注解,会提示


    file

    这个不是报错,只是idea提示,在pom文件中引入下面这个jar即可。

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
    </dependency>
    

    单元测试类SpringbootConfigApplicationTests.java

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootConfigApplicationTests {
    
        @Autowired
        Person person;
    
        @Test
        public void contextLoads() {
            System.out.println(person);
        }
    
    }
    

    运行单元测试类输出:


    file

    2.2 第三种@Value方式

    配置文件不变,
    Person.java

    @Component
    //@ConfigurationProperties(prefix = "person")
    public class Person {
    
        @Value("${person.lastName}")
        private String lastName;
    
        @Value("#{14*2}")
        private Integer age;
    
        @Value("true")
        private Boolean boss;
        private Date birth;
    
        private Map<String, Object> maps;
        private List<Object> lists;
        private Dog dog;
    
        // 省略掉getter、setter、toString方法
    }
    

    运行单元测试类输出:


    file

    注意:使用@Value注解需要保证所包含的键名在配置文件中是一定要存在的,否则会报错。比如注释掉配置文件中的lastName属性,然后在执行单元测试,报错如下:


    file

    解决方式:

    @Value("${person.lastName:null}")
        private String lastName;
    
    file

    2.3 @ConfigurationProperties与@Value的区别

    对比项 @ConfigurationProperties @Value
    功能 批量注入配置文件中的属性 一个个的绑定
    松散绑定 支持 不支持
    SpEL 不支持 支持
    JSR303数据校验 支持 不支持
    复杂类型封装 支持 不支持

    2.4 数据校验

    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
    
    //    @Value("${person.lastName:null}")
        @Email
        private String lastName;
    
    //    @Value("#{14*2}")
        private Integer age;
    
    //    @Value("true")
        private Boolean boss;
        private Date birth;
    
        private Map<String, Object> maps;
        private List<Object> lists;
        private Dog dog;
    }
    

    2.5 @PropertySource

    加载指定的配置文件
    新建一个person.properties

    person.last-name=xiaoH666
    person.age=29
    person.boss=false
    person.birth=2019/11/11
    person.maps.k1=v1
    person.maps.k2=v2
    person.lists=a,s,d
    person.dog.name=wangcai
    person.dog.age=2
    

    Person.java

    @PropertySource(value = "classpath:person.properties")
    @Component
    @ConfigurationProperties(prefix = "person")
    //@Validated
    public class Person {
    
    //    @Value("${person.lastName:null}")
    //    @Email
        private String lastName;
    
    //    @Value("#{14*2}")
        private Integer age;
    
    //    @Value("true")
        private Boolean boss;
        private Date birth;
    
        private Map<String, Object> maps;
        private List<Object> lists;
        private Dog dog;
    
        // /省略掉getter、setter、toString方法
    }
    

    执行单元测试,输出结果


    file

    3、源码

    GitHub:https://github.com/chenjiecg/SpringBoot.git

    本文由博客一文多发平台 OpenWrite 发布!

    相关文章

      网友评论

          本文标题:SpringBoot系列:2、配置

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