0
点赞
收藏
分享

微信扫一扫

SpringBoot配置——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

在浏览器测试:

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

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’运行测试类:

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

测试通过。谢谢阅读!


举报

相关推荐

0 条评论