SpringBoot六:yml配置及properties配置

  • Post author:
  • Post category:其他


本篇博客主要介绍yml语法与使用,@Value和@ConfigrationProperties的选择使用

一、Properties介绍

.properties作为大量的使用,在配置文件中,这里不多过多介绍

但是在IDEA编译器,乱码设置还是需要注意的(eclipse设置不了)

Settings->Editor->File Encodings,将自动转换勾选上,乱码就解决了


二、yml语法介绍

1、语法:k:(空格)v 表示一对键值对(

空格必须有

),

属性和值也是大小写敏感,

yml语法空格要求很重要

2、演示一个完整的写法


person:
   last-name : 张三
   age : 20
   date : 1990/1/1

如果是.properties写法就是

person.last-name=张三
person.age=2
person.date=1990/1/1

3、SpringBoot项目加入yml提示,在pom.xml引入依赖

	<!-- yml配置文件,获得提示信息 -->
	<dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-configuration-processor</artifactId>
	    <optional>true</optional>
	</dependency>

4、不同类型使用

字面量 :普通的值(数字,字符串,布尔) k : v
对象、Map

假设有dog(属性age,name)、maps集合两个对象成员变量

使用标准语法:

dog :

age:2

name :土狗


行内写法:

dog :{age : 2, name : 土狗}

maps : {k1 : v1, k2 : v2}

数组

假设有int数组num对象成员变量

使用标准语法:

num :

– 2

– 4


行内写法:

num : [2, 4]


字面需要注意:

  1. 字符串默认不用加上单引号或者双引号
  2. “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表达的意思
  3. name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
  4. ”:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
  5. name: “zhangsan \n lisi”:输出;zhangsan \n lisi

三、读取一个类的配置文件

如下类,已经跟配置文件进行关联,关联方式使用@ConfigurationProperties(prefix = “person”)

就是说可以通过配置文件,通过person设置类的值

package com.test.yml;

import java.util.Arrays;
import java.util.Date;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组中
 * @ConfigrationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 * perfix="person" :配置文件中哪个下面的所有属性进行--映射
 * 只有这个组件是容器中的组件,才能容器提供@ConfigrationProperties功能,所以加@Component
 * @author xuexue
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
	private String lastName;
	
	private int age;
   
	private Date date;
	
	private Map<Integer,Integer> maps;
	
	private int[] lists;
	
	private Dog dog;

	@Override
	public String toString() {
		return "Person [lastName=" + lastName + ", age=" + age + ", date=" + date + ", maps=" + maps + ", lists="
				+ Arrays.toString(lists) + ", dog=" + dog + "]";
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public Map<Integer, Integer> getMaps() {
		return maps;
	}

	public void setMaps(Map<Integer, Integer> maps) {
		this.maps = maps;
	}

	public int[] getLists() {
		return lists;
	}

	public void setLists(int[] lists) {
		this.lists = lists;
	}

	public Dog getDog() {
		return dog;
	}

	public void setDog(Dog dog) {
		this.dog = dog;
	}
	
}
package com.test.yml;

public class Dog {
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

通过配置文件,通过person设置类的值

application.properties配置(

最后结果会发现优先使用此配置文件

#properties属性
person.last-name=张三
person.age=2
person.date=1990/1/1
person.dog.name=""
person.dog.age=1
person.lists=1,2,3
person.maps.2=3
person.maps.3=4

application.yml配置

#通过yaml绑定,注入数据
person:
  last-name : 张三
  age : 20
  date : 1990/1/1
  maps : {1 : 2, 2 : 3}
  lists :
     - 2
     - 3
  dog :
    name : dog
    age : 1

编写测试文件,读取类是否存在信息

package com.test;

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;

import com.test.yml.Person;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test1 {
	@Autowired
	Person person;
	
	@Test
	public void contextLoads() {
		System.out.println(person);
	}

}


结果1

,会发现优先使用了.properties的配置文件配置的信息,而且乱码(上面已经解决此问题,这里是eclipse,目前也解决不了)

注释掉.properties配置文件,重启后测试,将会自动使用.yml文件,

结果2

如下

四、@Value和@ConfigurationProperties获取值比较及其选择

1、@Value获取属性值语法:

@Value(“${变量}”)

———–注意{}括号内不能有空格

2、@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定

  • 修饰在一个类上@ConfigrationProperties(perfix=”person”)
  • perfix=”person”:配置文件中哪个与修饰类的所有属性进行–映射

3、@Value获取值和@ConfigurationProperties获取值比较

功能 @ConfigurationProperties @Value
松散绑定(松散语法)

批量注入配置文件中的属性

支持(lastName 和 last-name)

一个个指定

支持(lastName 和 last-name),要一一对应

SpEl 不支持(不可以加入运算) 支持
JSR303数据检验 支持(邮箱验证等,@Validated) 不支持
复杂类型封装(map等) 支持 不支持


4、选择使用

无论配置文件yml还是properties他们都能获取到值


如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value


如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties

properties优先级高于yml,优先读取properties使用

properties 中文读取乱码,解决,用yml或者idea可以转换,eclipse不支持

五、@PropertySource注解指定配置文件

如果要指定配置文件,不使用全局的application.properties和application.yml配置文件,就需要在类上加此注解

加了后,在resource下创建person.properties即可



版权声明:本文为qq_41055045原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。