02、Spring Boot入门YAML基础语法
Spring Boot    2019-07-23 23:47:29    1118    0    0
acme   Spring Boot

    既然开始学习Spring Boot,那么需要用到配置。在Spring Boot项目中,resources下有两个目录,static和templates。其中static用于存放静态资源,例如图片文件、js、css、html等等。templates用于存放模板引擎资源,例如FreeMarker、Velocity等等。

    然后在resources根目录下还有一个文件,application.properties文件,用于于配置参数。既然是properties后缀,那么就是标准的properties配置格式,key=value。

    除了application.properties文件以外,还有一个application.yml(或者yaml后缀也行)。application这个文件名是不能更改的。application.yml用到了YAML语言来描述。

    在这里简单从网上简单摘要一下YAML语言的介绍。

诞生:
    YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822。
Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。
命名:
    YAML是"YAML Ain't a Markup Language"(YAML不是一种置标语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种置标语言)。
功能:
    YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表,标量等资料形态、。
它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定档、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
尽管它比较适合用来表达阶层式(hierarchical model)的数据结构,不过也有精致的语法可以表示关联性(relational model)的资料。
由于YAML使用空白字符和分行来分隔资料,使得它他特别适合用grep、Python、Perl、Ruby操作。
    其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构中会变得复杂而难以辨认。

说了这么多,就简单介绍一下YAML语法。

    数据类似大纲的缩进方式表达,左边表示属性,冒号后面带空格加值,连续的内容用减号"-"来表达,map的key和value用冒号":"来隔开。

上代码:

首先是pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cc.acme_me</groupId>
    <artifactId>springboot-yaml</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-yaml</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

接着是程序入口:

package cc.acme_me.springbootyaml;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootYamlApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootYamlApplication.class, args);
    }

}

再接着分别是三个Entity类User、Role和Card

package cc.acme_me.springbootyaml.entity;

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

import java.util.*;

/**
 * User entity
 *
 * @author acme
 * @ConfigurationProperties 注解用于标识注释参数 prefix标识对应的前缀
 * @Component 标识注入Spring容器中(只有注入Spring容器才能使用)
 */
@ConfigurationProperties(prefix = "user")
@Component
public class User {

    private Integer id;
    private String userName;
    private String password;

    private Date registerDate;

    private Integer privilegeLevel;

    private Role role;

    private List<String> hobbies = new ArrayList<>();

    private Map<Integer, Card> card = new HashMap<>();

    /**
     * 重新toString方法方便查看内容
     */
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", registerDate=" + registerDate +
                ", privilegeLevel=" + privilegeLevel +
                ", role=" + role +
                ", hobbies=" + hobbies +
                ", card=" + card +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegisterDate() {
        return registerDate;
    }

    public void setRegisterDate(Date registerDate) {
        this.registerDate = registerDate;
    }

    public Integer getPrivilegeLevel() {
        return privilegeLevel;
    }

    public void setPrivilegeLevel(Integer privilegeLevel) {
        this.privilegeLevel = privilegeLevel;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public List<String> getHobbies() {
        return hobbies;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    public Map<Integer, Card> getCard() {
        return card;
    }

    public void setCard(Map<Integer, Card> card) {
        this.card = card;
    }
}

 

package cc.acme_me.springbootyaml.entity;

import java.util.Date;

/**
 * 银行卡
 *
 * @author acme
 */
public class Card {

    private Integer id;
    private String cardNumber;
    private String cvv;
    private Date startDate;
    private Date endDate;

    /**
     * 重新toString方法方便查看内容
     */
    @Override
    public String toString() {
        return "Card{" +
                "id=" + id +
                ", cardNumber='" + cardNumber + '\'' +
                ", cvv='" + cvv + '\'' +
                ", startDate=" + startDate +
                ", endDate=" + endDate +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCardNumber() {
        return cardNumber;
    }

    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    public String getCvv() {
        return cvv;
    }

    public void setCvv(String cvv) {
        this.cvv = cvv;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
}

 

package cc.acme_me.springbootyaml.entity;

/**
 * 权限
 *
 * @author acme
 */
public class Role {

    private Integer id;
    private String level;

    /**
     * 重新toString方法方便查看内容
     */
    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", level='" + level + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}

还有就是yaml的配置了

server:
  port: 8080


user:
  id: 1
  userName: acme
  password: 123
  registerDate: 2020/2/2
  privilegeLevel: 15
  role:
    id: 1
    level: System
  hobbies:
    - 唱歌
    - 跳舞
  card: {1: {id: 1,cardNumber: 123,cvv: 321,startDate: 2000/01/01,endDate: 2010/01/01},2: {id: 2,cardNumber: 456,cvv: 654,startDate: 2010/01/01,endDate: 2020/01/01}}

最后一步便是运行看到效果,这个时候就用到了Spring Boot提供的测试注解

package cc.acme_me.springbootyaml;

import cc.acme_me.springbootyaml.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * Spring Boot单元测试
 *
 * @author acme
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootYamlApplicationTests {

    @Autowired
    private User user;

    @Test
    public void contextLoads() {
        System.out.println(user);
    }

}

看到控制台打印的数据是否正确呢?

 

Pre: 03、Spring Boot配置文件-properties

Next: 01、Spring Boot 入门 Hello World

1118
Table of content