SpringBoot的全局配置文件

SpringBoot的全局配置文件名称有两种,一种是我们比较熟悉的properties,另一种就是yaml。

yaml是什么?

YAML是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python,并从XML、电子邮件的数据格式中获得灵感。请尽可能使用.yaml,因为官方文件扩展名是.yaml ,但是还有许多人使用未经批准的.yml扩展名。

@ConfigurationProperties与@PropertySource

@ConfigurationProperties

@PropertySource

功能

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

通过@Value("${name}")单个绑定properties文件中的属性

松散绑定

支持

不支持

SpEL

不支持

支持---> $

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

  • yaml文件暂不支持使用@PropertySource("")注解,但是支持@ConfigurationProperties(prefix = "")
  • 松散绑定: yaml中写 last-name, 可以映射为Java类中驼峰命名的 lastName。' - ' 后第一个字母默认为大写
  • JSR303数据校验: 给字段加一层过滤器验证,保证数据的合法性

注意:

使用@ConfigurationProperties注解时,idea会提示下面,需要导入某个依赖(不导也能运行)

Spring Boot Conf iguration Annotation Processor not configured

使用@PropertySource注解时,将idea的setting-->Editor-->File Encoding,默认编码properties设置为 UTF-8,不然可能乱码

1.编写实体类

编写Person类

( 注意:不要将方式一和方式二同时放在同一个Person类里,还有导包导org.springframework...别导错了!!! )

/*
方式一:@ConfigurationProperties(prefix = "person")
将yaml配置文件中person的每一个对应属性的值,映射到这个组件中.可以放在类或者方法上
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private Dog dog;

 ...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}

/*
方式二:@PropertySource(value="classpath:config.properties")
路径配置有多种,可以官网细究
将properties配置文件中person的每一个对应属性的值,结合@Value("${name}")映射到这个组件中
也可以直接在@Value("")写值
*/
@Component
@PropertySource(value="classpath:application.properties")
public class Person {
    @Value("${name}")
    private String name;
    
    @Value("${age}")
    private int age;
    
    //不支持复杂类型封装,@Value("${dog}")会报错
    private Dog dog;

 ...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}

编写Dog类

@Component
public class Dog {
    private String name;
    private int age;
    ...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}

2.resources目录下分别编写application.properties和application.yaml配置文件

application.properties

name=JH
age=20
#由于不支持复杂类型封装,对象dog的属性就不写了

application.yaml

person:
  name: jh
  age: 18
  dog:
    name: 小黑
    age: 10

3.运行test下的测试类

@SpringBootTest
class Springboot01HelloworldApplicationTests {
    
    @Autowired
    Person person;
    
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

打印结果:

方式一@ConfigurationProperties :

Person{name='jh', age=18, dog=Dog{name='小黑', age=10}}

方式二@PropertySource :

Person

结论:

  • 配置yaml和配置properties都可获取值,但是springboot推荐使用yaml
  • 如果在业务中只需要获取配置文件的值,可以使用@PropertySource(value="classpath:xxx.properties")
  • 如果在需要编写一个Javabean来和配置文件进行映射,就可以使用@ConfigurationProperties(prefix = "xxx")

拓展

同时加上@ConfigurationProperties与@PropertySource

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value="classpath:application.properties")
public class Person {
    @Value("${name}")
    private String name;
    
    @Value("${age}")
    private int age;
    
    private Dog dog;

 ...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}

再运行test下的测试类,然后发现结果是

Person{name='jh', age=18, dog=Dog{name='小黑', age=10}}

可以看出@ConfigurationProperties与@PropertySource同时使用,@ConfigurationProperties会覆盖掉@PropertySource的打印结果

所以我们应该多使用SpringBoot推荐的 yaml配置文件