SpringBoot @Value 获取值和@ConfigurationProperties获取值比较

1.@Value获取值和@ConfigurationProperties获取值比较

  @ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

无论配置文件yaml还是properties他们都能获取到值;

如果说,我们在只是在某个业务中获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个JavaBean和配置文件进行映射,我们就直接使用onfigurationProperties;

2.举例解释(此处以yaml文件为例)

application.yaml

server:
    port: 8081
person:
    lastName: 张三
    age: 18
    boss: true
    birth: 2018/12/02
    map: {k1: c,k2: z}
    lists:
       - zz
       - bb
    dog:
      name: Tom
      age: 12
       

javabean

package com.hbsi.bean;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.validation.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;
/*
 *  将配置文件中配置的每一个属性的值,映射到这个组件
 *  @ConfigurationProperties:告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定;
 *  只有这个组件是容器中的组件,才能用容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
	//可以通过@Value获取配置文件中某一个值
	 @Email
	private String lastName;
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

(1) 松散绑定(此时用@ConfigutationPropertis)

application.yaml中的(application.propertiest同样可以用以下规则)

属性名匹配规则可以是 

   pseron:

  lastName:使用标准方式

  last_name:大写用-

  last-name:大写用-

(2)支持SpEL表达式(此时用@Value)

public class Person {
	
	private String lastName;
	@Value("#{11*2}")
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

(3)支持数据校验(此时用ConfigutationPropertis)

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
	
	 @Email//判断lastName是不是email格式
	private String lastName;
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

控制台输出为

Property: person.lastName
    Value: 张三
    Origin: class path resource [application.yml]:4:15
    Reason: 不是一个合法的电子邮件地址

(4)复杂类型封装

@Configuration支持(map,list)

server:
    port: 8081
person:
    map: {k1: c,k2: z}
    lists:
       - zz
       - bb
    dog:
      name: Tom
      age: 12
       

@Value不支持

@Value("person.map")
	private Map<String, String> map;

猜你喜欢

转载自blog.csdn.net/lbqlzch/article/details/82772148