初识YAML语法,YAML语法小结 @ConfigurationProperties注解用法

YAML语法

1. YAML基本语法:

key: 空格value 表示一对键值对(空格必须要有)
以空格的缩进来空值层级关系:只要是左对齐的一列数数据都是同一层级的。

server: 
	port: 8081
	path: /hello

属性和值也是大小写敏感的。

2. 值的写法

字面量:普通的值(数字,字符串,布尔)
k: v 字面量直接来写
字符串不用加上单引号或者双引号
“”:双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
name:“zhangsan \n list” :输出:zhangsan 换行 list
‘’:单引号:会转移特殊字符,特殊字符最终就会被转为一个普通的字符串。
name:“zhangsan \n list” :输出:zhangsan \n list

对象、Map (属性和值)(键值对):
k: v 在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式

  • 正常写法
		friends: 
			lastName: zhangsan
			age: 20
  • 行内写法:
friends: {
    
    lastName: zhangsan,age: 18}

数组(List、set):
用 -值表示数组中的一个元素

  • 正常写法
pets:
 - cat
 - dog
 - pig
  • 行内写法
pets: [cat,dog,pig]

3. 配置文件值注入

yaml配置配置文件写法

person:
	birthday: "2020-01-01"
	name: zhangsan
	age: 55
	pets: [cat,dog,pig]
	isBoss: true
	friends:
		- lisi
		- wangwu
		- zhaoliu
	maps: {
    
    k1: v1,k2: 12}
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中;
* @ConfigurationProperties : 告诉SpringBoot将本类中的所有属性和配置文件中相关的属性进行	* 绑定;
* prefix = “peron” : 配置文件中哪个下面的所有属性进行一一映射;
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person{
    
    
	private String lastName;
	private Integer age;
	private Boolean isBoss;
	private Date birthday;
	
	private Map<String,Object> maps;
	private List<Friends> friends;
	
	...
}

pom.xml

<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

对应的properties写法

person.lase-name=张三
person.age=18
person.birthday=2020/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=12
person.lists=a,b,c
person.dog.name=dog
person.dog.age=5
  • 需要注意的是:在idea中 properties配置文件的默认编码是utf-8

找到idea 设置中的file Encodings ,将对号挑上(在运行时转码),不修改中文就会乱码。
在这里插入图片描述

4. 用环境变量、配置文件中获取值

String中的xml值绑定写法

<bean class="Person">
	<property name="lastName" value="字面量/${key}从环境变量、配置文件中回去值/#{spEl}">
</bean>

在java代码中获取值

@Component
@ConfigurationProperties(prefix = "person")
public class Person{
    
    
	
	@Value("${person.last-name}")
	//lastName 必须是邮箱格式
	@Email 
	private String lastName;
	@Value("#{11*2}")
	private Integer age;
	@Value("${maps}")//会注入失败,因为不能匹配复杂数据类型
	private Map<String,Object> maps;
	
}
注解 @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个一个的指定
松散绑定 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • 如果以@ConfigurationProperties 方式取值上方的@Email会进行校验,而@Vlaue不会进行校验。
  • 什么是松散绑定:当以@ConfigurationProperties 进行取值时候last-name 和lastName是一样的。
  • spEl :#{12*5} 在{ }内进行计算

如何选择/使用场景:
因为@Value不支持复杂类型数据的封装比如Map,所以如果说是普通数据类型的获取,使用@Value来获取比较好
但是如果说,我们专门编写了一个javaBean来和配置文件进行映射,那么我们就直接使用@ConfigurationProperties
当然它们也可以结合使用

  • @PropertySource注解的使用

@ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值,有的时候需要把不相关的信息写到别的配置文件中,这时候就需要指定该配置文件的位置。
使用@PropertySource注解来指定配置文件的位置

  • @ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效。
    SpringBoot里面没有Spring配置文件,有的时候我们希望让这些配置文件里面的内容生效。
    就是用该@ImportResource注解。
//导入Spring的配置文件让其生效
@ImportResource(locations = {
    
    "classpsth:beans.xml"})
  • SpringBoot 推荐的给容器中添加组件的方式

使用全注解的方式,使用Java代码进行配置。

@Configuration注解标识是一个配置类
使用@Bean给容器添加组件

  • @Bean标签的作用:将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名。
@Configuration
public class MyConfig{
    
    
	@Bean
	public HelloService helloService01(){
    
    
		System.out.println("配置类@Bean给容器中添加组件了...");
		return new HelloService();
	}
}
//组件名默认是方法名
  • 在配置文件中使用占位符获取之前配置的值,如果没有可以使用:指定默认值。
  • 也可以使用随机数生成默认值
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43941676/article/details/108569369
今日推荐