一、实现方式
1、@ConfigurationProperties(prefix = “person”),prefix标明从哪个前缀开头的属性开始,默认从application.properties/yml主配置文件中读取,也可以用过@PropertySource(value={“classpath:person.properties”})注解指定读取的配置文件。
- 作用在类上,从配置文件中读取属性回填到对象,支持复杂的结构如:list、map、对象等,推荐使用。
- 支持@Validated数据校验
2、@Value注解
- 作用在属性上,需要对属性逐个绑定
- 不支持复杂类型封装
- 不支持@Validated
二、区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 作用在类上,实现批量注入属性值 | 作用在属性上,需要逐个绑定 |
松散绑定 | 支持 | 不支持 |
SpEL(表达式) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
三、代码演示
1、实例对象,使用@ConfigurationProperties
package com.wsy.properties.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@Validated
public class Person {
//@Email
private String name;
private int age;
private String addr;
private List<String> books;
private Map<String, String> courseMapTeacher;
private Dog dog;
}
package com.wsy.properties.model;
import lombok.Data;
@Data
public class Dog {
private String name;
private int age;
}
2、使用@Value注解
package com.wsy.properties.model;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
//@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="name" value="字面量/${key}从环境变量、配置文件中获取的值/#{SpEl}表达式"></property>
* </bean>
*/
@Email
@Value("${person.name}")
private String name;
@Value("#{2*3}")
private int age;
@Value("${person.addr}")
private String addr;
//@Value注解不支持
private List<String> books;
//@Value注解不支持
private Map<String, String> courseMapTeacher;
//@Value注解不支持
private Dog dog;
}
3、配置文件
application.properties
person.name=jack
person.age=18
person.addr=北京市
person.books=java,python.go
person.course-map-teacher.key1=v1
person.course-map-teacher.key2=v2
person.dog.name=tom
person.dog.age=2
application.yml
person:
name: lucy
age: 16
addr: 北京
books: [java,kafka,netty]
course-map-teacher: {key1: v1,key2:v2}
dog:
name: ${person.name}
age: ${random.int(5)} #表达式
4、演示结果
@ConfigurationProperties
Person(name=jack, age=18, addr=北京, books=[java, python.go], courseMapTeacher={key1=v1, key2=v2, key2v2=}, dog=Dog(name=tom, age=2))
@Value:
Person(name=jack, age=6, addr=北京, books=null, courseMapTeacher=null, dog=null)
使用@ConfigurationProperties方式时,如果@Email注释放开则会被校验住,而@Value则不会
且如果配置文件没有bean的配置,使用@Value会报错,而@ConfigurationProperties不会报错,默认加载对象的默认值
四、@PropertySource 读取指定配置文件
@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@PropertySource("classpath:person.properties") // 指定具体的配置文件
public class Person
五、@ImportResource:导入Spring配置文件,让配置文件里面的内容生效
1、自定义spring配置文件:
<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx" >
<bean id="person" class="com.wsy.properties.model.Person"></bean>
</beans>
2、在启动类上加上注解@ImportResource(locations = {“classpath:bean.xml”}),spring会加载配置文件,将配置文件中指定的类注入到ioc容器中
3、运行结果
Person(name=null, age=0, addr=null, books=null, courseMapTeacher=null, dog=null)
六、思维导图