用这个@Value注解可以不导入之前那个GAV
我们之前配置文件 绑定映射 到JavaBean的值都是用 @ConfigurationPropertie
用@Value也是可以的,它是Spring的一个注解,无论配置文件是 yml还是properties他们都能获取到值; 而且支持以下SpEL写法。
2021年10月2日 13:28:30 补充: @value 这个注解 后面加上 : 默认值 如果找不到的话 就用默认值。。。
配置文件(properties文件):
#private String lastName;
#private Integer age;
#private Boolean boss;
#private Date birth;
#private Map<String,Object> maps;
#private List<Object> lists;
#private Dog dog;
#=============================================================
#person.lastName 相等于 person.last-name【松散写法】
person.last-name=BiHu
person.age=18
person.boss=false
person.birth=2025/10/10
person.maps.k1=value1
person.maps.k2=value2
person.lists=v1,v2,v3,v4
person.dog.name=小勾勾
person.dog.age=2
JavaBean.java:
package com.bihu.Bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
//@ConfigurationProperties(prefix = "person")
public class JavaBean {
/**
* 支持下面三种写法
* value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}" 下面一一演示:
* */
@Value("${person.last-name}") //直接字面量
private String lastName;
@Value("#{2*3}")
private Integer age;
@Value("false")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
里面三种写法已经展示,运行测试:
package com.bihu;
import com.bihu.Bean.JavaBean;
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) //有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效,
@SpringBootTest
public class ApplicationTests {
//这里测试JavaBean
@Autowired
JavaBean Person;
@Test
public void contextLoads() {
System.out.println(Person);
}
}
结果:
Person{lastName='BiHu', age=6, boss=false, birth=null, maps=null, lists=null, dog=null}
可以看出 ,lastName是直接获取到配置文件中的数据写入,然后 age 是用 #{表达式} 直接算出注入,boss 为false 是直接字面量写入的。
@Value获取值和@ConfigurationProperties获取值比较⭐⭐⭐
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
1. 功能不用多说,都知道
2.松散语法: 就是驼峰用-表示,即: lastName 相当于 last-Name , 如果配置文件是“ person.last-name=BiHu ”,如果用@Value这样写: @Value("${person.lastName}") ,会获取不了会报错,因为@Value不支持松散语法,反之如果是 @ConfigurationProperties注解来注入,就不会,因为他支持这个松散写法。
关于是否支持松散语法提示: 不用想那么多,配置文件怎么样写那就怎么样写即可...
3.spel表达式 ,其实就是 那个 “#{表达式}” 这个表达式就是 spel表达式。
4.JSR303数据校验:
JavaBean的值如果要校验,我们在JavaBean放一个@Validated 说明映射值绑定需要校验,然后我们在 某成员变量写一个注解 @Email 表示下面这个成员变量需要是邮箱格式,会校验的,如果不是则报错!
JavaBean.java:
package com.bihu.Bean;
import org.hibernate.validator.constraints.Email;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
@Validated //这个注解说明JavaBean的值映射需要校验
public class JavaBean {
@Email //这个注解说明 lastName一定得邮箱数据类型
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
配置文件(properties)
#private String lastName;
#private Integer age;
#private Boolean boss;
#private Date birth;
#private Map<String,Object> maps;
#private List<Object> lists;
#private Dog dog;
#=============================================================
#person.lastName 相等于 person.last-name【松散写法】
#person.last-name=bihu 报错!!!!!
# person.last-name=123@qq.com 不报错!!!!因为是一个邮箱格式的写法
person.age=18
person.boss=false
person.birth=2025/10/10
person.maps.k1=value1
person.maps.k2=value2
person.lists=v1,v2,v3,v4
person.dog.name=小勾勾
person.dog.age=2
这就是JSR303数据校验。
5.复杂类型封装:
其实就是List、Map、数组和对象,@Value注解是不支持注入的,@ConfigurationProperties是支持的,例如下面注入maps的时候会报错:
@Value("${person.maps}") //这样会报错!因为@Value不支持特殊数据类型 只支持基本数据类型
private Map<String,Object> maps;
总结:
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;【记住:单独需要某项值】
我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
一般都是用@ConfigurationProperties!
这就是@Value的使用 和 @Value获取值和@ConfigurationProperties获取值 不同
千万别弄混:
@Value 是有了配置文件 然后在配置文件中取某个数据注入【不需要依赖GAV】
@ConfigurationProperties 是直接在配置文件中的数据绑定过来。【需要依赖GAV】