既然开始学习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);
}
}看到控制台打印的数据是否正确呢?
acme