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