SpringBoot读写操作yml配置文件方法

目录
  • yml配置规则
  • 普通的kv读取
  • 读取到集合和数组
  • 读取为对象和Map

yml配置规则

属性跟属性值之间使用“:”和一个“空格”隔开,层级结构通过缩进对齐,缩进只能使用空格,不能用tab,并且大小写敏感,使用#注释文档;

yml配置除了能像properties读取为kv结构,还能方便的读取成集合(List、Set等)、数组、对象、Map,还能进行嵌套结构读取;

普通的kv读取

普通kv结构可以直接使用@Value标签读取,@Value除了可以读取普通kv,也能读取List或Map结构里的某一项;另外使用Environment.getProperty()方法也能像properties那样读取kv结构,但也只能以kv结构读取;

yml格式:

xxx: xxxx
xxx:
 xxx: xxxx
 xxx:
  xxx: xxxx
  xxx: xxxx
 xxx: xxxx

可以直接使用@Value("${xxx}")、@Value("${xxx.xxx.xxx}")读取;

读取到集合和数组

使用@Value直接读取好像只能使用xxx: xxxx,xxxx,xxxx逗号隔开的格式,可以读取成List、Set或者数组,其他格式可以放到Bean里当作类的属性读取;

yml格式:

xxx:
 - xxxx
 - xxxx
 - xxxx
xxx: [xxxx,xxxx,xxxx]
xxx: xxxx,xxxx,xxxx

读取为对象和Map

对象和Map的格式是一样的,只是读取的目标不同;读取为对象时需要提供setXXX方法,并且XXX要跟配置文件里命名一致;(另外测试时发现自动生成的set方法,对驼峰结构修改大小写会造成无法识别到配置)

yml格式:

xxx:
 x: xxxx
 x: xxxx
 x: xxxx
xxx: {x: xxxx, x: xxxx, x: xxxx}

另外各种格式可以组合嵌套使用,例如list里使用map或者map里包含list;

Demo:

yml配置文件application.yml:

#yml文件
 
a: hello
val:
 b: 123
 c: false
 d: ENV
 
mybeantest:
 name: Tom
 age: 14
 addr: 北京
 bestfriend: ${myArrayA[3]}
mybeantest2: {name: Jerry, age: 13, id: 1001}
 
myArrayA:
 - tom
 - jerry
 - jack
 - alice
myArrayB: [a,b,c]
myListC: 3,4,5,6
myListD: [{name: Jerry, age: 11, addr: 上海},{name: Jack, age: 12, addr: 北京}]
myListE:
 - {name: Bob, age: 22}
 - {name: Lily, age: 21}
myListF:
 - name: AAA
   age: 11
 - name: BBB
   age: 22
myListG:
 - - aaa
   - bbb
   - ccc
 - - dd
   - ee
   - ff
 
maps:
 mapA:
  A: 1
  B: 2
  C: 3
  D: 4
 mapB:
  a: AA
  b: BB
  c: CC
 mapC: {X: x, Y: y, Z: z}
 mapD:
  L1:
   - x
   - y
   - z
  L2:
   - X
   - Y
   - Z
 mapE:
  M1:
   a: A
   b: B
  M2:
   C: c
   D: d
 mapF:
  m1: {name: TOM, age: 33}
  m2: {name: JERRY, age: 44}

读取为bean的类MyBean.java和MyBean2.java:

package testspringboot.test3;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "mybeantest")
public class MyBean {
	public String name;
	public int age;
	public String address;
	public String bestFriend;
	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 String getAddress() {
		return address;
	}
	public void setAddr(String address) {//setXXX方法,只需XXX跟配置文件里的名称对应即可(自动生成的set方法驼峰结构修改大小写会造成干扰)
		this.address = address;
	}
	public String getBestFriend() {
		return bestFriend;
	}
	public void setBestFriend(String bestFriend) {
		this.bestFriend = bestFriend;
	}
	@Override
	public String toString() {
		return "MyBean [name=" + name + ", age=" + age + ", address=" + address + ", bestFriend=" + bestFriend + "]";
	}
}
package testspringboot.test3;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "mybeantest2")
public class MyBean2 {
	public String name;
	public int age;
	public int id;
	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 int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Override
	public String toString() {
		return "MyBean2 [name=" + name + ", age=" + age + ", id=" + id + "]";
	}
}

读取为集合的类MyList.java:

package testspringboot.test3;
import java.util.List;
import java.util.Set;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "")
public class MyList {
	public List<String> myArrayA;
	public Set<String> myArrayB;
	public Integer[] myListC;
	public List<MyBean> myListD;
	public List<MyBean> myListE;
	public List<MyBean> myListF;
	public List<List<String>> myListG;
	public List<String> getMyArrayA() {
		return myArrayA;
	}
	public void setMyArrayA(List<String> myArrayA) {
		this.myArrayA = myArrayA;
	}
	public Set<String> getMyArrayB() {
		return myArrayB;
	}
	public void setMyArrayB(Set<String> myArrayB) {
		this.myArrayB = myArrayB;
	}
	public Integer[] getMyListC() {
		return myListC;
	}
	public void setMyListC(Integer[] myListC) {
		this.myListC = myListC;
	}
	public List<MyBean> getMyListD() {
		return myListD;
	}
	public void setMyListD(List<MyBean> myListD) {
		this.myListD = myListD;
	}
	public List<MyBean> getMyListE() {
		return myListE;
	}
	public void setMyListE(List<MyBean> myListE) {
		this.myListE = myListE;
	}
	public List<MyBean> getMyListF() {
		return myListF;
	}
	public void setMyListF(List<MyBean> myListF) {
		this.myListF = myListF;
	}
	public List<List<String>> getMyListG() {
		return myListG;
	}
	public void setMyListG(List<List<String>> myListG) {
		this.myListG = myListG;
	}
	@Override
	public String toString() {
		return "MyList [myArrayA=" + myArrayA + ",\n myArrayB=" + myArrayB + ",\n myListC=" + myListC + ",\n myListD="
				+ myListD + ",\n myListE=" + myListE + ",\n myListF=" + myListF + ",\n myListG=" + myListG + "]";
	}
}

读取为Map的类MyMap.java:

package testspringboot.test3;
import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "maps")
public class MyMap {
	public Map<String, Integer> mapA;
	public Map<String, String> mapB;
	public Map<String, String> mapC;
	public Map<String, List<String>> mapD;
	public Map<String, Map<String, String>> mapE;
	public Map<String, MyBean2> mapF;
	public Map<String, Integer> getMapA() {
		return mapA;
	}
	public void setMapA(Map<String, Integer> mapA) {
		this.mapA = mapA;
	}
	public Map<String, String> getMapB() {
		return mapB;
	}
	public void setMapB(Map<String, String> mapB) {
		this.mapB = mapB;
	}
	public Map<String, String> getMapC() {
		return mapC;
	}
	public void setMapC(Map<String, String> mapC) {
		this.mapC = mapC;
	}
	public Map<String, List<String>> getMapD() {
		return mapD;
	}
	public void setMapD(Map<String, List<String>> mapD) {
		this.mapD = mapD;
	}
	public Map<String, Map<String, String>> getMapE() {
		return mapE;
	}
	public void setMapE(Map<String, Map<String, String>> mapE) {
		this.mapE = mapE;
	}
	public Map<String, MyBean2> getMapF() {
		return mapF;
	}
	public void setMapF(Map<String, MyBean2> mapF) {
		this.mapF = mapF;
	}
	@Override
	public String toString() {
		return String.format("MyMap [mapA=%s,\n mapB=%s,\n mapC=%s,\n mapD=%s,\n mapE=%s,\n mapF=%s]", mapA, mapB, mapC, mapD,
				mapE, mapF);
	}
}

进行测试用的类Test3Class.java:

package testspringboot.test3;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class Test3Class {
	@Value("${a}")
	public String a;
	@Value("${val.b}")
	public int b;
	@Value("${val.c}")
	public boolean c;
	@Autowired
	public Environment env;
	@Resource
	public MyBean bean;
	@Resource
	public MyBean2 bean2;
	@Value("${myArrayA[3]}")
	public String arrayA_3;
	@Value("${myArrayB[1]}")
	public String arrayB_1;
	@Value("${myListC}")
	public List<Integer> list;
	@Value("${myListC}")
	public Set<String> set;
	@Value("${myListC}")
	public String[] array;
	@Resource
	public MyList mylist;
	@Resource
	public MyMap mymap;
	@PostConstruct
	public void fun() {
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(env.getProperty("val.d"));
		System.out.println(bean);
		System.out.println(bean2);
		System.out.println(arrayA_3);
		System.out.println(arrayB_1);
		System.out.println(list);
		System.out.println(set);
		System.out.println(array);
		System.out.println(mylist);
		System.out.println(mymap);
	}
}

启动类(只测配置文件,所以设置WebApplicationType.NONE关闭web服务):

package testspringboot.test3;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Test3Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SpringApplication sapp = new SpringApplication(Test3Main.class);
		sapp.setWebApplicationType(WebApplicationType.NONE);
		sapp.run(args);
	}
}

执行结果:

到此这篇关于SpringBoot读写操作yml配置文件方法的文章就介绍到这了,更多相关SpringBoot读写操作yml 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot项目多层级多环境yml设计详解

    目录 需求场景 想要达到的效果 实现 需求场景 基础设施模块中有一些通用固定的基础配置.例如:日志的配置,Spring本身的配置以及MyBatis Plus相关的固定配置等等. 这些配置往往与环境无关,如何复用? # 日志配置 logging: level: # 记得配置到包名 com.agileboot: debug org.springframework: info pattern: console: "%date %thread %green(%level) [%cyan(%logger{

  • SpringBoot动态更新yml文件

    目录 前言 项目依赖 YML文件内容获取 YML文件内容更新 YML属性刷新 Property刷新 注解刷新 前言 在系统运行过程中,可能由于一些配置项的简单变动需要重新打包启停项目,这对于在运行中的项目会造成数据丢失,客户操作无响应等情况发生,针对这类情况对开发框架进行升级提供yml文件实时修改更新功能 项目依赖 项目基于的是2.0.0.RELEASE版本,所以snakeyaml需要单独引入,高版本已包含在内 <dependency> <groupId>org.yaml</

  • SpringBoot读写操作yml配置文件方法

    目录 yml配置规则 普通的kv读取 读取到集合和数组 读取为对象和Map yml配置规则 属性跟属性值之间使用“:”和一个“空格”隔开,层级结构通过缩进对齐,缩进只能使用空格,不能用tab,并且大小写敏感,使用#注释文档: yml配置除了能像properties读取为kv结构,还能方便的读取成集合(List.Set等).数组.对象.Map,还能进行嵌套结构读取: 普通的kv读取 普通kv结构可以直接使用@Value标签读取,@Value除了可以读取普通kv,也能读取List或Map结构里的某一

  • SpringBoot动态修改yml配置文件的方法详解

    目录 前言 具体实现 实现代码 测试 源码 总结 前言 记录下SpringBoot修改yml配置文件后无需重启服务的方式(打包后生效),效果如下: 具体实现 实现代码 pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </d

  • Springboot如何通过yml配置文件为静态成员变量赋值

    目录 通过yml配置文件为静态成员变量赋值 这里我强调一句 Springboot静态变量读取yml配置信息 解决方式1 解决方式2 通过yml配置文件为静态成员变量赋值 我们对springboot为普通成员变量的方式很熟悉,所以经常定式思维的认为静态属性的赋值和普通属性一样,结果调试的时候调试半天发现静态属性还是Null. 仔细一想才发现静态属性和普通属性的赋值方式不太一样. 到底是哪里不一样呢?问题出在set方法.我们通过idea快捷键或注解 @Data 得到的set方法是静态方法. 这里我强

  • 关于springboot加载yml配置文件的no字段自动转义问题

    目录 加载yml配置文件的no字段自动转义 springboot配置文件自动转译的坑 小结一下 加载yml配置文件的no字段自动转义 项目上线了才发现一个字段被转义了,如下图: 本来应该会拿到no字段和数据进行比对的,结果发现比对完的数据这个字段全是null,debug才发现这个字段这么写在加载yml文件之后自动变成了"false",第一次发现这个问题,修改很方便,把yml文件里面这个no,换成'no'就可以不被转义成"false"了,谨以此提醒,小错误导致临时调整

  • 基于Properties类操作.properties配置文件方法总结

    目录 一.properties文件 二.Properties类 Properties类使用详解 概述 常见方法 写入 读取 遍历 一.properties文件 Properties文件是java中很常用的一种配置文件,文件后缀为".properties",属文本文件,文件的内容格式是"键=值"的格式,可以用"#"作为注释,java编程中用到的地方很多,运用配置文件,可以便于java深层次的解耦. 例如java应用通过JDBC连接数据库时,可以把数

  • SpringBoot yml配置文件读取方法详解

    目录 yaml介绍 yaml语法规则 yaml数据读取 Environment读取yaml全部属性数据 自定义对象封装指定数据 yaml介绍 YAML(YAML Ain't Markup Language),一种数据序列化格式 优点: 容易阅读 容易与脚本语言交互 以数据为核心,重数据轻格式 YANL文件扩展名 .yml(主流) .yaml 几种数据格式比较 yaml语法规则 大小写敏感 属性层级关系使用多行描述,每行结尾使用冒号结束 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许

  • springboot如何引入外部yml配置文件

    目录 springboot引入外部yml配置文件 springboot引入多个yml 1. 项目内部配置文件 2. 外部配置加载顺序 springboot引入外部yml配置文件 当需要在springboot中引用其他的yml文件时,需要在application.yml里配置 spring: profiles: include: email,xmyb 值得注意的是:application-email.yml的前缀一定要和主在配置文件application.yml的名字一致 springboot引入

  • C#实现ini文件读写操作

    本文实例为大家分享了C#语言实现ini文件读写操作的具体代码,供大家参考,具体内容如下 1.ini文件是什么? 见百度百科 2.C#语言实现ini文件的读写操作 /// <summary> /// 配置文件 .ini操作类 /// </summary> public class IniFileUtils { /// <summary> /// 写入INI文件 /// </summary> /// <param name="section&qu

  • SpringBoot在yml配置文件中配置druid的操作

    最新版的druid和旧版在filter配置方面有些不同,以下是旧版druid中配置filter: spring: ##数据库连接信息 datasource: url: jdbc:mysql://localhost:3306/young username: root password: root driver-class-name: com.mysql.jdbc.Driver ###################以下为druid增加的配置########################### t

  • spring-boot读取props和yml配置文件的方法

    最近微框架spring-boot很火,笔者也跟风学习了一下,废话不多说,现给出一个读取配置文件的例子. 首先,需要在pom文件中依赖以下jar包 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <d

随机推荐