@Value和@ConfigurationProperties获取配置信息

目录

前言

配置读取

@Value注解中"#{}"和"${}"区别


前言

在java项目中,我们可以通过以下几种常用方式获取并绑定配置文件中的信息:

  • @Value注解
  • Spring的Environment类(可通过接口或直接注入方式获取,然后使用getProperty()方法)
  • @ConfigurationProperties注解(SpringBoot下使用)

@ConfigurationProperties是 Springboot 提供读取配置文件的一个注解,主要用于将配置文件中每个属性的值映射到当前类,被标识的类一定要放到容器的组件中,所以还需要使用 @Component 注解或 @Configuration 注解

@Value是 Spring 下获取配置文件的一个注解,如果该注解读取时未能找到对应的配置项且未设置默认值,则会报错

本文简单记录这两种注解的使用方式

配置读取

@ConfigurationProperties 配置文件如下:

# @ConfigurationProperties注解配置
# String 配置读取
config.test.strV=stringTest
# int 配置读取
config.test.intV=4
# boolean 配置读取
config.test.bolV=true
# list 两种配置读取方式
config.test.list=zhangSan, liSi
#config.test.list[0]=zhangSan
#config.test.list[1]=liSi

# map(bean同理) 两种配置读取方式
config.test.map.k1=v1
config.test.map.k2=v2
config.test.map.k3=v3
#config.test.map[k1]=v1
#config.test.map[k2]=v2
#config.test.map[k3]=v3

@Value 配置文件如下:

# @Value注解配置
# String 配置读取
config.value.strV=stringTest
# int 配置读取
config.value.intV=4
# boolean 配置读取
config.value.bolV=true
# list 配置读取,主要是通过分隔符进行分割
config.value.list=zhangSan,liSi

# map 配置读取
config.test.map={k1:'v1', k2:'v2', k3:'v3'}

配置文件实体类:

@Configuration
@ConfigurationProperties(prefix = "config.test")
public class ConfigTest {

    private String strV;
    private Integer intV;
    private boolean bolV;
    private List<String> list;
    private Map<String, String> map;

    @Override
    public String toString() {
        return "ConfigTest{" +
                "strV='" + strV + '\'' +
                ", intV=" + intV +
                ", bolV=" + bolV +
                ", list=" + list +
                ", map=" + map +
                '}';
    }

}

测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ConfigTestTest {

    @Autowired private ConfigTest configTest;

    @Value("${config.value.strV:defalutStringValue}") private String strV;
    @Value("${config.value.intV:8}") private Integer intV;
    @Value("${config.value.bolV:false}") private boolean bolV;
    @Value("#{'${config.value.list:null}'.split(',')}") private List<String> list;
    @Value("#{${config.test.map}}") private Map<String, String> map;

    @Test
    public void test() {
        // @ConfigurationProperties 注解测试
        System.out.println(configTest.toString());
        System.out.println("------------");
        // @Value 注解测试
        System.out.println("strV=" + strV);
        System.out.println("intV=" + intV);
        System.out.println("bolV=" + bolV);
        System.out.println("list=" + list);
        System.out.println("map=" + map);
    }
}

输出如下:

ConfigTest{strV='stringTest', intV=4, bolV=true, list=[zhangSan, liSi], map={k1=v1, k2=v2, k3=v3}}
------------
strV=stringTest
intV=4
bolV=true
list=[zhangSan, liSi]
map={k1=v1, k2=v2, k3=v3}

@Value注解中"#{}"和"${}"区别

@Value("#{}"):SpEL表达式,通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量

@Value("${}"):可以获取对应属性文件中定义的属性值

猜你喜欢

转载自blog.csdn.net/m0_38001814/article/details/113033250