全局配置文件
Spring Boot使用一个application.properties或者application.yml作为全局配置文件,在Spring Boot项目启动时,
会自动加载application.properties文件。
- 通过配置文件进行属性注入
public class Pet {
private String name;
private String type;
...省略set get方法
}
@Component //用于将Person类作为Bean注入Spring容器中
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入该类中
public class Person {
private int id;
private String name;
private List<String> hobby;
private String[] family;
private Map<String,String> map;
private Pet pet;
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", hobby=" + hobby +
", family=" + Arrays.toString(family) +
", map=" + map +
", pet=" + pet +
'}';
}
...省略set get方法
@ConfigurationProperties(prefix = “person”) | 将配置文件中以person开头的属性值通过setter方法注入实体类对应属性 |
---|---|
@Component | 当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样它才能被@ConfigurationProperties注解赋值 |
<!--配置处理器依赖,为了出现代码提示的效果来方便配置,在使用@ConfigurationProperties注解
进行配置文件属性值注入时,可以添加以下依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 对于yml文件,使用key:(空格)value格式配置属性,使用缩进控制层级关系,有行内写法和缩进式写法两种方式。
- application.properties配置文件优先级要高于application.yml配置文件优先级。
// properties文件格式 (二选一)
# 对实体类对象Person进行属性配置
person.id=1
person.name=tom
person.hobby=play,read,sleep
person.family=father,mother
person.map.k1=k1
person.map.k2=k2
person.pet.type=dog
person.pet.name=kimi
// yml文件格式
person:
id: 2
name: jerry
hobby: [read,play,football]
family: [father,mother]
map: {k1: k1,k2: k2}
pet: {type: cat,name: tom}
编写测试类,运行测试可在控制台得到person对象的属性
@RunWith(SpringRunner.class)
@SpringBootTest
class Chapter02ApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
配置文件属性值注解注入对比
- 使用Spring Boot全局配置文件配置属性时
如果配置的属性是Spring Boot默认提供的属性,如server.port,那么Spring Boot会自动扫描并读取属性值。
如果是如上图的实体类Person属性,则必须在程序中注入这些配置属性方可生效。
- 使用@ConfigurationProperties注入属性
– 该注解是Spring Boot提供
– 该注解用来快速方便将配置文件中的自定义属性值批量注入某个Bean对象的多个对应属性中。
– 需要注意的是,使用@ConfigurationProperties注解批量注入属性值时,要保证配置文件的属性和对应实体类的属性名一致,否则无法正确获取并注入属性值。 - 使用@Value注入属性
– 该注解是Spring框架提供,用来读取配置文件中的属性值并逐个注入Bean对象的对应属性
– Spring Boot框架对Spring框架中@Value注解进行了默认继承,故还可以使用
– 使用@Value注解注入的类型只能是基本数据类型
@Component //用于将Person类作为Bean注入Spring容器中
//@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入该类中
public class Person {
@Value("${person.id}")
private int id;
@Value("${person.name}")
private String name;
private List<String> hobby;
private String[] family;
private Map<String,String> map;
private Pet pet;
//测试过程如上
对比分析
- 底层框架
– @ConfigurationProperties注解是SpringBoot自带;而@Value注解是Spring框架支持的
– Spring Boot框架对Spring进行了默认支持,故也可使用@Value注解 - 功能
– @ConfigurationProperties注解:将配置文件中属性批量注入Bean对象
– @Value注解:只能单个注入属性 - 属性setter方法
– @ConfigurationProperties注解进行属性注入时,必须为每一个属性设置setter方法,通过对应的注解才能够将配置文件中属性一一匹配。如果配置文件中没有配置属性值,会将对应Bean属性置空。
– @Value注解不需要为属性设置setter方法,该注解会先通过表达式读取配置文件中的属性值,然后自动注入下方的Bean属性上。如果读取的配置文件属性为空,进行属性注入的程序会自动报错。 - 复杂类型数据注入
– @ConfigurationProperties注解支持任意数据类型属性注入,包括基本数据类型和复杂数据类型
– @Value注解只能注入基本数据类型 - 松散绑定
– @ConfigurationProperties注解支持松散绑定语法
– @Value注解不支持松散绑定语法进行属性注入
person.firstName=james //标准写法,对应Person类属性名
person.first-name=james //使用“-”分隔多个单词
person.first_name=james //使用“_”分隔多个单词
PERSON.FIRST_NAME=james //使用大小写格式,推荐常量属性配置
- JSR303数据校验
– @ConfigurationProperties注解在进行配置文件属性值注入时,支持JSR303数据校验,其主要作用是校验配置文件中注入对应Bean属性的值是否符合相关值的规则
– 如果注入的配置文件属性值不符合相关校验规则,程序会自动报错
– @Value注解不支持JSR303数据校验功能
@Component
@ConfigurationProperties(prefix = "person")
@Validated //引入Spring框架支持的数据校验规则
public class Example{
@Email //对属性进行规则匹配
private String email;
public void setEmail(String email){
this.email = email;
}
}
- SpEL表达式
– @Value注解注入配置文件属性时,支持SpEL语法,即"#{xx}"
– @ConfigurationProperties注解不支持SpEL语法
@Value("#{5*2}") //使用@Value注解的SpEL表达式直接为属性注入值
private int id;