上一篇我们讲解了用@ConfigurationProperties获取配置文件的值,这次我们来讲另一种方法,@Value
Value方法获取配置文件的值
我们把@ConfugurationProperties注释掉,然后加上value注释($匹配,#后边的为算术式)
/**
* 将配置文件中配置的没一个属性的值映射到这个组建中
* @configurationproperties:告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix="person"配置文件中person下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties的功能
*/
@Component
//@ConfigurationProperties(prefix="person")
public class Person {
/*
<bean class="person">
<property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
<bean/>
*/
@Value("${person.last-name}")
private String lastName;
@Value("#{10*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object>lists;
private Dog dog;
我们来测试一下
在这里我们匹配的三个选项都匹配成功,成功导出
下面我们来分析一下@ConfigurationProperties与@Value的区别
功能:结合上一篇我们使用的@ConfigurationProperties,我们会发现使用@ConfigurationProperties可以直接全部进行映射,而@Value必须要一个一个的去映射
松散绑定:我们可以试验一下,将 @Value("${person.last-name}")中的last-name改为last.name,运行一下会发现报错;实验一下@ConfigurationProperties,发现运行成功过。所以,@ConfigurationProperties
支持松散绑定,@Value不支持
SpEL:我们使用@Value时支持算术式,在使用@ConfigurationProperties时,我们尝试把配置文件age处改为算术式时,运行会报错
JSR303数据校验:我们加一个@Validated注解,然后加一个校验规则,比如加一个@Emile,校验匹配是否为电子邮箱格式。先给@ConfigurationProperties检验
@Component
@ConfigurationProperties(prefix="person")
@Validated
public class Person {
/*
<bean class="person">
<property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
<bean/>
*/
//@Value("${person.last-name}")
//last-name必须为邮箱格式
@Email
private String lastName;
//@Value("#{10*2}")
private Integer age;
//@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object>lists;
private Dog dog;
我们发现检验出来错误,说明@ConfigurationProperties支持JSR303数据校验
然后我们再用@Value时进行检验
@Component
//@ConfigurationProperties(prefix="person")
@Validated
public class Person {
/*
<bean class="person">
<property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
<bean/>
*/
//last-name必须为邮箱格式
@Email
@Value("${person.last-name}")
private String lastName;
@Value("#{10*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object>lists;
private Dog dog;
我们发现并没有变化,所以@Value不支持JSR303数据校验
复杂类型封装:我们单独用@Value来获取一下maps
@Component
//@ConfigurationProperties(prefix="person")
//@Validated
public class Person {
/*
<bean class="person">
<property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
<bean/>
*/
//last-name必须为邮箱格式
@Email
//@Value("${person.last-name}")
private String lastName;
//@Value("#{10*2}")
private Integer age;
// @Value("true")
private Boolean boss;
private Date birth;
@Value("{person.maps}")
private Map<String,Object> maps;
private List<Object>lists;
private Dog dog;
我们发现报错了,所以说@Value不支持复杂类型封装,这是@ConfigurationProperties和@Value 最大的区别
配置文件不管是yml还是properties都能获取到值
用法:
1.如果说我们在某个业务逻辑中需要获取一下配置文件的某项值,使用@Value;
这里我们可以写一个Controller
@RestController
public class Controller {
@Value("${person.last-name}")
private String name;
@RequestMapping("/sayHello")
public String sayHello(){
return "Hello " +name;
}
}@RestController
public class Controller {
@Value("${person.last-name}")
private String name;
@RequestMapping("/sayHello")
public String sayHello(){
return "Hello " +name;
}
}
运行测试,网页测试
2.如果说我们专门编写了一个JavaBean来和配置文件进行映射时,我们就直接使用@ConfigurationProperties