@Value 取赋值详解与 @ConfigurationProperties 对比

本文为转载,原文地址:地址

本文导读

  • @Value 与 @ConfigurationProperties 都可以从全局配置文件中获取值然后注入到属性中
  • 本来主要讲解两种取值以及注入值的区别
  • 对于 "@ConfigurationProperties 注入值"不了解的可以参考《Spring Boot 全局配置文件》

@Value 取值注入

* 以前在Spring核心配置文件beans.xml用如下配置为某个类的属性注入值
* 
*      
*      
*      
*      
* 
* 现在直接使用 @Value (xxx) 注解 就可以直接为某个属性注入值了,等价于上面

application. yml

  • 后面会使用“@Value”从"application.yml"配置文件中取值

@Value 取赋值详解与 @ConfigurationProperties 对比_第1张图片

server:
   port: 8081
user:
   id: 110
   lastName: 张三
   age: 110
   birthday: 2018/07/11
   colorList:
     - red
     - yellow
     - green
   cityMap: {mapK1: mapV1,mapK2: mapV2}
   dog:
     id: 9527
     name: 哮天犬
     age: 100

POJO 属性取赋值

package com.lct.wmx.damain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Created by Administrator on 2018/7/11 0011.
 * 狗 实体类
 *
 * @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使本来成为-
 * Spring容器中的组件,这样Spring容器才能为它DI注入值
 */
@Component
public class Dog {

    /**
     * 赋值普通的Java数据类型值
     */
    @Value("1000")
    private Integer id;

    /**
     * ${key}:从环境变量以及配置文件中获取值
     */
    @Value("${user.lastName}")
    private String name;

    /**
     * #{SpEL}Sping 表达式语言
     */
    @Value("#{10*3}")
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

测试 运行

 

package com.lct.wmx;

import com.lct.wmx.damain.Dog;
import com.lct.wmx.damain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * SpringBoot单元测试
 * 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldQuickApplicationTests {

    /**
     * 因为POJO类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
     * 所以使用@Autowired或者@ResourceDI注入在取值即可
     */
    @Resource
    private Dog dog;

    @Test
    public void contextLoads() {
        System.out.println("------------------------------********************--------------------------------------------");
        System.out.println("·······················" + dog);
    }
}

@Value 取赋值详解与 @ConfigurationProperties 对比_第2张图片

区别总览表

对比项     @ConfigurationProperties @Value
注解功能 将配置文件中的属性值批量注入类的各个属性 为类中的各个属性逐个赋值
松散绑定 支持 不支持
SpEL(Spring 表达式) 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
     
  • 两者都可以从配置文件 .yml 与 .properties 中获取到值;
  • 如果项目中只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value即可;
  • 如果项目中专门编写了一个JavaBean来和配置文件进行映射,则直接使用@ConfigurationProperties即可;

你可能感兴趣的:(@Value 取赋值详解与 @ConfigurationProperties 对比)