4.YAML的语法

1.基本语法
  空格必须存在!
k:(空格)v 表示一对键值对,空格必须存在!!!
以空格的缩进来控制层级关系,左对齐的一列数据属于同一层级:
例如:
server:
  port: 8081
  path: /hello

属性和值都是大小写敏感的!

 

2.值的写法

1.字面量:普通得值(数字,字符串,布尔)
    k:(空格)v:字面量直接来写
    字符串默认不用加上单引号或者双引号
    若加上单引号或双引号时:
        ""双隐号:不会转义字符串中的特殊字符;特殊字符会作为本身要表示的意思
            name: "zhangsan\nlisi" 输出:张三 换行 李四
        ''单引号:会转义特殊字符,特殊字符最终会作为普通的字符串本身
            name: 'zhangsan\nlisi' 输出:zhangsan\nlisi
            
2.对象、Map(属性和值)(键值对)
    k:v 在下一行来写对象的属性和值的关系,注意缩进
        对象还是k: v的方式
    示例:
        friend:
                lastName: zhangsan
                age: 20
    第二种写法:行内写法
        friend: {lastName: zhangsan,age: 20}
        
    数组(List,Set):用-(空格)值来表示数组中的一个元素
        示例:
            pets:
                - cat
                - dog
                - pig
        数组的行内写法:
            pets: [cat,dog,pig]

3.yaml文件绑定到实体类的做法

实体类的写法:
    //1.该类并没有写注解
    public class Dog {
        private String name;
        private Integer age;
        get/set方法
        tostring方法
    }
    //2.person类
    /**
     * 将配置文件中配置的每个属性的值,映射到这个组件中
     * @ConfigurationProperties标签告诉springboot将本类中的所有属性和配置文件中的相关配置进行绑定
     * prefix = "person"表示配置文件中的哪个属性进行一一绑定
     */
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private boolean boss;
        private Date birth;
    
        private Map<String, Object> map;
        private List<Object> list;
        private Dog dog;
        get/set方法
        tostring方法
    }

2.yaml文件的写法:注意空格和间隙
    server:
      port: 8081
      path: /hello
    
    person:
      age: 18
      boss: true
      birth: 1992/06/06
      map:
        K1: v1
        k2: v2
      list: [wmd,ld,张三]
      dog:
        name: ld
        age: 18
      name: wmd
      
3.sringboot的启动类:
    @SpringBootApplication-->标注@SpringBootApplication注解:告诉springboot这是配置类
    public class SpringbootHelloworldQuickApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootHelloworldQuickApplication.class, args);
        }
    }

4.测试类:
    @RunWith(SpringRunner.class)---->使用springboot的测试类
    @org.springframework.boot.test.context.SpringBootTest
    public class SpringBootTest {
        @Autowired
        private Person person;
        @Test
        public void test01(){
            System.out.println(person.toString());
        }
    }
5.pom文件必须导入
    <!--导入配置文件处理器:配置文件进行绑定时就会有提示-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-configuration-processor</artifactId>
       <optional>true</optional>
    </dependency>    
启动步骤:
    1.先启动springboot的启动类
    2.再启动springboot的测试类
输出:
    Person{name='wmd', age=18, boss=true, birth=Sat Jun 06 00:00:00 CST 1992, map={K1=v1, k2=v2}, list=[wmd, ld, 张三], dog=Dog{name='ld', age=18}}

 

问题:
除了springboot的版本问题导致某些jar包不可用:
可以使用:2.1.3版本,该版本的springboot测试可用
 
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.3.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
2.测试类的层级结构会导致错误!例如

上述也可以使用properties文件进行绑定:
其他不变,prpperties文件写法

person.name=吴孟达
person.age=18
person.birth=1992/06/06
person.map.k1=v1
person.map..k2=v2
person.list=a,b,c
person.dog.name=刘丹
person.dog.age=18

但是输出:
    Person{name='���ϴ�', age=18, boss=false, birth=Sat Jun 06 00:00:00 CST 1992, map={k1=v1, k2=v2}, list=[a, b, c], dog=Dog{name='����', age=18}}
发现其输出properties输出中文乱码:
解决如下:
解决properties文件乱码如下:

@ConfigurationProperties和@Value的区别
 
@ConfigurationProperties
@Value
功能
批量注入配置文件中的值
一项一项注入配置文件中的值
松散绑定
支持
不支持
spel
不支持
支持
JSR303数据校验
支持
不支持
复杂类型封装
支持
不支持
1.松散绑定:
    perosn中有一个属性如下:
        private String parentName;
    application.properties文件中该属性值的写法如下:
        1.-的下一位字符表示大写
            person.parent-name=吴孟达父
        2._的下一位字符表示大写
            person.parent_name=吴孟达父   
        3.PERSON_PARENT_NAME=吴孟达父
2.spel
    在配置文件中不能这么写:
        person.age=#{12*12}
        
3.JSR303的数据校验
    1.在@ConfigurationProperties
        @Component
        @ConfigurationProperties(prefix = "person")
        public class Person {
            @Email----->可以校验name配置是否符合邮箱格式,不符合就报错
            private String name;
        }
    2.在@Value标签
         @Component
         public class Person {
             @Value("${person.name}")
             @Email----------------->不能进行校验
             private String name;
         }
4.复杂类型
    @Value("${person.map}")------------->无法进行绑定注入
    private Map<String, Object> map;

 

posted @ 2022-05-09 20:58  努力的达子  阅读(144)  评论(0编辑  收藏  举报