SpringBoot配置——yaml配置文件值获取

YAML语法可以参考《YAML文件的基本语法》

application.properties和application.yml都是SpringBoot的配置文件,它们位于src/main/resources目录下,专门用于修改默认配置的。

1、首先在src/main/resources目录下创建application.yml

~/Desktop/MySpringboot$ touch src/main/resources/application.yml

2、在application.yml中加入以下配置信息

server:
        port: 8088
person:
        lastName: Sam
        age: 18
        boss: false
        birth: 2020/03/21
        maps: {k1: v1,k2: v2}
        lists:
                - Tom
                - Sam
        dog:
                name: small dog
                age: 2

如果用application.properties文件来配置,那么上述数据就等价于:

server.port=8088
person.lastName=Sam
person.age=18
person.boss=false
person.birth=2020/03/21
person.maps.k1=v1
person.maps.k2=v2
person.lists=Tom,Sam
person.dog.name=small dog
person.dog.age=2

3、创建一个Person类,用于将配置文件中的属性值映射到此类中来

Person.java

package com.wong.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 将配置文件中配置的每一个属性值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 * 			prefix = "person":配置文件中哪个下面的所有属性值进行一一映射
 * 	注意:只有这个组件是容器的组件,才能使用容器提供的ConfigurationProperties功能
 */
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person{
	private String lastName;
	private int age;
	private boolean boss;
	private Date birth;

	private Map<String,Object> maps;
	private List<Object> lists;
	private Dog dog;

	// 省略setter、getter方法
}

  • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,prefix = “person”:配置文件中哪个下面的所有属性值进行一一映射。
  • @Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
  • Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中

其实我们还可用@Value标注来绑定值:

@Configuration
//@ConfigurationProperties(prefix = "person")
public class Person{
	@Value("${person.lastName}")
	private String lastName;

	@Value("${person.age}")
	private int age;
	
	@Value("${person.boss}")
	private boolean boss;
	
	@Value("${person.birth}")
	private Date birth;
	
	@Value("${person.maps}") // 失败
	private Map<String,Object> maps;
	
	@Value("${person.lists}") // 失败
	private List<Object> lists;
	
	
	@Value("${person.dog}") // 失败
	private Dog dog;

	// 省略setter、getter方法
}

比较一下@Value和@ConfigurationProperties的区别:

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 逐个指定
松散语法 支持,即lastName、last_name、LAST_NAME都会认为是相同的 不支持
SpEL 不支持 支持,见示例1
JSR303数据校验 支持,见示例2 不支持
复杂类型封装 支持 不支持

因此有复杂类型封装或者定义了javaBean来映射配置项,我们就选用@ConfigurationProperties。在单独使用某个属性时,就用@Value。
示例1:

@Configuration
public class Person{
	@Value("#{10*2}")
	private int age;
	

	// 省略setter、getter方法
}

示例2:

@Configuration
@ConfigurationProperties(prefix = "person")
@Validated
public class Person{
	@mail
	private String lastName; // 必须符合邮件格式
	...
}

4、使用配置信息

@RestController
@RequestMapping("world")
public class HelloWorldController{

        @Autowired
        private Person person;

        @GetMapping("hi")
        public String index(){
                return person.getLastName();
        }
}

@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。

5、运行并测试

运行:

~/Desktop/MySpringboot$ mvn spring-boot:run

在浏览器测试:
在这里插入图片描述

6、单元测试

在src/test/java/com/wong下创建测试类:

package com.wong;

import com.wong.bean.Person;
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;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootConfigTests {

    @Autowired
    private Person person;
    @Test
    public void testPerson(){

        System.out.println(person.getLastName()+"kkkkk");
    }

}

右键SpringBootConfigTests.java,点击RUN 'SpringBootConfigTests’运行测试类:
在这里插入图片描述测试通过。谢谢阅读!

发布了381 篇原创文章 · 获赞 85 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_40763897/article/details/105088284