YAML语法格式及应用
项目的属性配置是学习中的很重要的一点,也就是自动配置时要修改默认属性的时候,我们就要在配置文件中做出说明。而配置文件除了传统的application.properties,这些年也流行起了application.yml,也就是上面说的YAML。而YAML和property差不多的使用方法,除了语法有些差距。
刚开始先来看看最最传统的配置文件的方法:XML方式,它和Property和YAML语法格式之间的差距:
XML:
<server>
<port>8081</port>
</server>
YAML:
server:
port: 8081
Property:
server.port=8081
可以看出,传统的XML方式大量时间花费在<></>上,YAML就很好的完善和简化了步骤。
下面我们就先说一下YAML的语法:
(1)表示一对键对:”K: V”(注意:冒号和V之间一定要有空格,这是yaml的格式!!!)
(2)YAML是以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级的,例如:
people:
name: 小帅
age: 20
其中name和age是同一层级的
(3)要注意YAML对大小写敏感,其中如果写成lastName可以使用last_name替代,即_n可以表示N。
(4)字符串默认不用加上双引号或单引号,假如加上双引号,比如“\n”的话就会换行,假如加上单引号,比如‘\n’就直接输出\n。
(5)除了使用K: V方式,还可以使用行内写法:
people: {name: zhangsan,age: 18}
(6)数组表示:
pets:
- dog
- duck
- chick
而行内写法是pets: [dog,duck,chick]
这些大概就是YAML的大部分语法,想在要说的是配置文件值的注入,这也是初学时候经常遇到的。
首先在application.yml(配置文件)中输入:
people:
name: 小帅
age: 20
handsome: true
birth: 2018/7/25
map: {k1: v1,k2: v2}
lists:
- 小明
- 小军
dog:
name: Tom
age: 2
关注一下:people类里面有string,integer,boolean,data,map,list,甚至还引用了一个类dog。
我们在javaBean中输入:
//省略了包名和导入的包
@Component
@ConfigurationProperties(prefix="people")
public class People {
private String name;
private Integer age;
private boolean handsome;
private Date birth;
private Map<String,Integer> map;
private List<String> lists;
private Dog dog; //类dog定义好,含name和age
//省略了toString()函数和get()和set()函数
}
再在测试类中做测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private People people;
@Test
public void contextLoads() {
System.out.println(people);
}
}
测试通过,可以看到结果。
另外,在打代码过程中可能发现提醒:
这是我们需要在POM文件中加入:
<!-- 导入配置文件处理器,配置文件进行绑定时会有提醒-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
补充:
这章除了说明YAML的语法和使用,还想说一下几个在配置文件注入和与配置文件使用中很有用的注解:
@ConfigurationProperties():该注解是配置文件注入的时候必要使用的,而且主要是文件内容的整体注入的时候,表面该类是一个注入类,它的括号内含有prefix=”xxx”;其中xxx就是配置文件中整体bean的信息。举例:上面中使用@ConfigurationProperties(prefix="people") 表示注入配置文件中的people。
@Value():该注解和上面的@ConfigurationProperties一样,都是用于配置文件的注入的,但是上面的是针对整体,而@Value是针对个体的,也就是获得某个bean的信息。使用方法是括号内配合”${xx}”或”#{xx}”使用,而$一般是取得某个bean信息,举例子:要取得上面people中的name,则使用@Value(“{people.name}”);而#中可以使用公式,例如@Value(“{11*2}”)。
@PropertySource:用于加载指定的配置文件,比如此时除了application.properties以外,还新建了一个people.properties,而这时候想使用people.properties作为指定的配置文件,则只需要在注入类中类上面加入@ PropertySource(value = {“classpath: person.properties”})即可(在上面例子中@Companent上加)
@ImportResource:导入Spring的配置文件,让配置文件中的内容生效;Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能识别,这时候想让Spring的配置文件(beans.xml之类的)生效,这加入@ImportResource。举例子,为了使beans.xml生效,这时候要加入@ImportResource(locations ={“classpath:beans.xml”}).导入Spring的配置文件让其生效
@Bean:给IOC容器中添加组件,代替的是之前xml中的<bean> </bean>的格式。与@Configuration配合使用