SpringBoot给属性注入值的两种方式:
一、使用 @ConfigurationProperties 注解
该注解将全局配置文件(application.properties 或 application.yml 文件)中配置的每一个属性的值,映射到当前类的属性上。告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
【注意】:@ConfigurationProperties 注解只能映射全局配置文件中所配置的属性值,如果是自定义的配置文件,则映射不到。
1.javaBean:
/**
* prefix = "person":配置文件中person 下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能,因此需要使用 @Component 注解将当前类扫描到容器中;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
2.配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
3.测试
在 SpringBoot的测试类中进行测试:
springboot 单元测试,可以在测试期间很方便的将类自动注入到容器。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootConfigApplicationTests{
@Autowired
Person person;
@Test
public void contestLoads(){
System.out.println(person);
}
}
二、使用 @Value 注解为 bean 的属性注入值。
类似于spring 配置文件中用标签配置bean,@value 注解可以直接给bean的属性赋值。
<bean> <property name="name" value="zs"></property></bean>
@Value注解的使用方式和标签的方式一样,可以使用以下方式配置值:
(1).字面量;
(2).${key},从环境变量、配置文件中获取值;
(3).#{SpEL};
1.javaBean
@Component
public class Person {
@Value("${person.lase-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
2.配置文件
person.last-name=张三
person.age=18
person.boss=false
3.测试(同@configurationProperties测试方法)
三、@Value获取值和@ConfigurationProperties获取值比较
无论全局配置文件是 yml 还是 properties 他们都能获取到值,但有如下不同:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
【tips】:
(1).松散绑定是指:无论是 yml 配置文件中叫last-name、lastName、或者 properties 文件中叫 person.last-name,都能成功的将配置文件的值注入给bean的属性。
(2).复杂类型封装:@Value 注解的方式无法给类似于 Map 等类型的属性注入值,只能给简单数据类型注入值。
如何选择:
(1)如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
(2)如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
举例:
@RestController
public Class HelloController{
@Value("${person.last-name}")
private String name;
@RequestMapping("sayhello")
public String sayHello(){
return "hello"+name;
}
}
启动 springboot 应用后,在页面访问 localhost:8081/sayhello,页面正常返回数据。
四、配置文件注入值数据校验
只有@ConfigurationProperties 的方式支持注入数据值校验。
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
//emailAddress必须是邮箱格式
@Email
private String emailAddress;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;