SpringBoot极简教程 · Spring Boot 分布式微服务

002SpringBoot之YAML详解

2018-05-18  本文已影响71人  编程界的小学生

一、SpringBoot配置文件

1、两种形式

SpringBoot使用一个全局的配置文件,配置文件名(application)是固定的。但是有两种形式,如下:

application.properties
application.yml
application.yaml(同上)

2、配置文件作用

修改配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在启动的时候都给我们配置好了,所以我们开箱即用。比如我们不喜欢内置的8080端口呢?或者我们要配数据源呢?等等,这些都需要在这里配置。

二、什么是YAML

1、概念

YAML(YAML Ain't Markup Language)

YAML A Markup Language:是一个标记语言

YAML isn't Markup Language:不是一个标记语言

2、例子

YAML:以数据为中心,比json,xml等更适合做配置文件。

server:
    port: 8081

三、YAML语法:

1、基本语法

key:(空格)value:(空格)表示一对键值对(空格必须有);

以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。

server: 
    port: 8080
    path: /hello
spring:
    redis:
        timeout: 600

PS:注意以下几点:

1、key:后面有空格(因为折行了,所以有好几个空格)。

2、value:后面有空格。

3、port和path同级别。server和spring同级别。

4、属性和值都大小写敏感。

2、值的写法

2.1、字面量:普通的值(数字,字符串,布尔等等)

k: v:字面直接来写;

​ 字符串默认不用加上单引号或者双引号;

​ "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

​ name: "zhangsan \n lisi":输出;zhangsan 换行 lisi

​ '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

2.2、对象、Map(属性和值)(键值对):

k: v:在下一行来写对象的属性和值的关系;注意缩进

对象还是k: v的方式

friends:
        lastName: zhangsan
        age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

PS:不管哪种写法,上面那种驼峰(lastName)的,可以采取两种方式,1:lastName;2:last-name

2.3、数组(List、Set):

用- 值表示数组中的一个元素

pets:
 - cat
 - dog
 - pig

行内写法

pets: [cat,dog,pig]

四、配置文件值注入

1、JavaBean

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件(Person)中
 *
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 *      prefix:配置文件中哪个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件才能使用容器提供的功能(@ConfigurationProperties所提供的功能),
 * 所以添加@Component注解,使之成为Spring容器中的组件。
 *
 * @author chentongwei@bshf360.com 2018-05-17 14:05
 */
@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    // 这种驼峰写法在yml里可以用lastName或者last-name,都可以
    private String lastName;
    private Integer age;
    private boolean isBoss;
    private Date birth;

    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;
    ...省略getter/setter/toString....

PS:好好看注释,该解释的都解释的很到位了。

2、YAML配置文件

person:
  lastName: 张三
  age: 25
  isBoss: false
  birth: 2017/12/12
  maps: {key1: value1,key2: value2}
  lists:
    - 雷军
    - 乔布斯
    - 马云
  dog:
    name: milly
    age: 2

3、测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02ConfigApplicationTests {

   @Autowired
   private Person person;

   @Test
   public void contextLoads() {

      System.out.println(person);

   }

}

4、输出结果

Person{lastName='张三', age=25, isBoss=false, birth=Tue Dec 12 00:00:00 CST 2017, maps={key1=value1, key2=value2}, lists=[雷军, 乔布斯, 马云], dog=Dog{name='milly', age=2}}

5、换成Properties

# idea默认使用的是utf8编码的,而properties默认使用ascii编码,所以中文肯定会乱码。
# 解决乱码:File--》Settings--》Editor--》File Encodings==》UTF-8

#person.last-name=张三
#person.age=25
#person.birth=2017/12/15
#person.boss=true
#person.maps.key1=value1
#person.maps.key2=value2
#person.lists=a,b,c
#person.dog.name=dog
#person.dog.age=2

PS:properties会出现乱码。解决properties乱码的办法注释已给出。

五、YAML自动提示

疑问:我知道内置的一些配置会有提示,比如输入server就会有提示。但是输入我们上面自定义的person就完全没提示,怎么办呢?

答案:配置一个依赖就行了,如下:

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

六、广告

img
上一篇 下一篇

猜你喜欢

热点阅读