赞
踩
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁,但描述数据的方式略微难于xml。
YML文件的扩展名可以使用.yml或者.yaml,虽然扩展名不同,但二者没有本质区别。
语法: key: value
示例:键与冒号之间没有空格,而值与空格间必须有一个英文半角空格
# 配置普通数据
name: chenfeilin
语法1:
key:
key1: value1
key2: value2
示例:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别,但一般默认两个空格,缩进多度也影响阅读。
# 配置对象数据1
person:
name: feilin
age: 24
语法2:
key: {key1: value1,key2: value2}
示例:
# 配置对象数据2
student: {name: stu,age: 77}
配置Map数据
语法同上,上述数据结构既可以解析为对象,也可以解析为map集合。这里不再举例。
配置数组(List、Set)数据
语法1:
key:
- value1
- value2
示例:value1与之间的 - 之间存在一个空格
# 配置数组(List、Set)数据1
mylist:
- chenfeilin
- 777
- nagasawa_masami
语法2:
key: [value1,value2]
示例:
# 配置数组(List、Set)数据2
city: [beijing,tianjin,shanghai,chongqing]
当集合中的元素为对象形式的时候:
# 集合中的元素是对象形式
users:
- name: zhangsan
age: 18
- name: lisi
age: 28
- name: wangwu
age: 38
@Value 注解用于配置文件中单个键值的映射。
我们写一个controller,其中随便定义几个属性来接收配置文件中的值:
@RestController public class TestController { @Value("${name}") private String name; @Value("${person.name}") private String personName; @RequestMapping(value = "/getValue") public String TestMapping() { System.out.println("name: " + name); System.out.println("personName: " + personName); return "request OK"; } }
启动工程访问 http://localhost:8080/getValue
访问成功,接下来看控制台:OK
我们使用注解 @ConfigurationProperties可以完成配置文件中对象值到Java配置对象的映射
具体使用方法是通过注解@ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射
例如配置文件中的person
person:
name: feilin
age: 24
下来看代码:
// 先提供一个载体,用来作为接收对象 @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } // 然后修改并获取到person @RestController public class TestController { @Value("${name}") private String name; @Autowired private Person person; @Value("${person.name}") private String personName; @RequestMapping(value = "/getValue") public String TestMapping() { System.out.println("name: " + name); System.out.println("person: " + person); System.out.println("personName: " + personName); return "request OK"; } }
控制台输出也没有问题:
需要注意的是,person类这里必须提供get和set方法,否则将无法获得配置文件中的值,此注解是通过set方法向对应的属性赋值的。而我们在使用@value 注解的情况下,是不用set方法也可以的。
我们可以再来配置一下其他的类型,例如集合,数组类型,我们修改一下配置文件:
person:
name: feilin
age: 24
mylist:
- chenfeilin
- 777
- nagasawa_masami
address: [beijing,tianjin,shanghai,chongqing]
girlFriends:
- girlName: zhangsan
girlAge: 18
- girlName: lisi
girlAge: 28
- girlName: wangwu
girlAge: 38
同时修改一下配置类,再添加一个类:
// 添加类gril public class Girl { private String girlName; private int girlAge; public String getGirlName() { return girlName; } public void setGirlName(String girlName) { this.girlName = girlName; } public int getGirlAge() { return girlAge; } public void setGirlAge(int girlAge) { this.girlAge = girlAge; } @Override public String toString() { return "Girl{" + "girlName='" + girlName + '\'' + ", girlAge=" + girlAge + '}'; } } // 修改配置类如下 @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; private List<String> mylist; private String[] address; private Set<Girl> girlFriends; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getMylist() { return mylist; } public void setMylist(List<String> mylist) { this.mylist = mylist; } public String[] getAddress() { return address; } public void setAddress(String[] address) { this.address = address; } public Set<Girl> getGirlFriends() { return girlFriends; } public void setGirlFriends(Set<Girl> girlFriends) { this.girlFriends = girlFriends; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", mylist=" + mylist + ", address=" + Arrays.toString(address) + ", girlFriends=" + girlFriends + '}'; } }
最后控制台输出:
name: chenfeilin
person: Person{name=‘feilin’, age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[beijing, tianjin, shanghai, chongqing], girlFriends=[Girl{girlName=‘zhangsan’, girlAge=18}, Girl{girlName=‘lisi’, girlAge=28}, Girl{girlName=‘wangwu’, girlAge=38}]}
personName: feilin
如果你有多个yml配置文件的话,在和配置类映射时,可以通过注解 @PropertySource 来将其区分,
我们先随便创建一个配置文件,将person的内容拷贝过去,然后给person类加上注解
具体的使用实例如下:
@Component @ConfigurationProperties(prefix = "person") @PropertySource(value = {"classpath:abc.yml"}, factory = YamlPropertySourceFactory.class) public class Person {...} // 这里需要注解里需要指定一个yaml的加载工厂类,我们可以自己去定义一个: // 使用的是YamlPropertySourceLoader类的load方法 public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { if (resource == null) { return super.createPropertySource(name, resource); } List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()); return sources.get(0); } } /** 导的包如下: import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; */
控制台输出结果不变:
person: Person{name=‘feilin’, age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[beijing, tianjin, shanghai, chongqing], girlFriends=[Girl{girlName=‘zhangsan’, girlAge=18}, Girl{girlName=‘lisi’, girlAge=28}, Girl{girlName=‘wangwu’, girlAge=38}]}
这里需要注意的一点是,注解 @PropertySource 在不指定factory属性的情况下肯定是是不会报错的,但是他将无法将我们yml配置文件中的值加载出来,这里不指定factory属性时应该是使用了默认的加载器,但其默认不支持加载yml文件,所以记得要加上这个yml文件加载工厂类。
SpringBoot的配置文件,主要的目的就是对默认的配置信息进行修改的,但是我们不可能完全记住所有配置的键值,在使用时可以去翻阅文档
这里提供了一个springboot【2.0.1.RELEASE】版本的官网配置文档:
文档URL:
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-application-properties
上边官网提供的配置信息的查询,是帮助我们将配置信息的认识从无到有的,当我们掌握和熟练使用一些配置信息后,肯定还是会不查资料,直接去写的,但是因为种种不可描述的原因,写错球咯,这时候需要一些提示功能帮我们找回记忆!
介绍这个内容的博客也有很多了,而且这个也不用写代码,没啥技术含量,就不重复造轮子了,附上一个之前看过的博客链接:
解决idea不支持SpringBoot yml文件
以及中文注释乱码问题:
spring boot application.yml文件中文注释乱码
补充:
我用的idea版本可能比较新
里边使用到的插件可能和上边博客的不一致,这里附图
再补充:
有时候你自己创建yml文件,或者使用其他插件创建yml文件的时候,例如JBLSpringBootAppGen插件,在你刚刚创建出文件时,会发现yml中无法提示,即使你在之前的项目中已经有了提示,此时可能也还是会没有提示,你需要将项目Rebuild之后再操作yml文件,此时提示才会生效。0.0
当yml文件过长或想根据业务划分的话,可以用以下配置,引入拆分出去的子配置文件
嵌套单个:
spring:
profiles:
include:filename
嵌套多个:
spring:
profiles:
include:
- filename1
- filename2
子配置文件名为application-xxx.yml,例如嵌套单个时:application-filename.yml
附上链接:
1.springboot多环境配置文件,如何包含多个yml配置文件?看这一篇就够了
2.springboot配置多个yml文件
3.关于SpringBoot的application.yml的相关配置(自定义,开发,测试,正式)切换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。