SpringBoot开发【配置】@ConfigurationProperties和Value的区别

850 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

上一篇我们讲解了用@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;
    }

}

运行测试,网页测试

测试结果

  1. 如果说我们专门编写了一个JavaBean来和配置文件进行映射时,我们就直接使用@ConfigurationProperties