list;
private Position position;
// 省略getter,setter,toString方法
}三、配置文件取值
Spring Boot通过ConfigurationProperties注解从配置文件中获取属性。从上面的例子可以看出ConfigurationProperties注解可以通过设置prefix指定需要批量导入的数据。支持获取字面值,集合,Map,对象等复杂数据。ConfigurationProperties注解还有其他特么呢?它和Spring的Value注解又有什么区别呢?带着这些问题,我们继续往下看。(๑•̀ㅂ•́)و✧
一)ConfigurationProperties和Value优缺点
ConfigurationProperties注解的优缺点
一、可以从配置文件中批量注入属性;
二、支持获取复杂的数据类型;
三、对属性名匹配的要求较低,比如user-name,user_name,userName,USER_NAME都可以取值;
四、支持JAVA的JSR303数据校验;
五、缺点是不支持强大的SpEL表达式;
Value注解的优缺点正好相反,它只能一个个配置注入值;不支持数组、集合等复杂的数据类型;不支持数据校验;对属性名匹配有严格的要求。最大的特点是支持SpEL表达式,使其拥有更丰富的功能。
二)@ConfigurationProperties详解
第一步:导入依赖。若要使用ConfigurationProperties注解,需要导入依赖 spring-boot-configuration-processor;
第二步:配置数据。在application.yml配置文件中,配置属性参数,其前缀为itdragon,参数有字面值和数组,用来判断是否支持获取复杂属性的能力;
第三步:匹配数据。在类上添加注解ConfigurationProperties,并设置prefix属性值为itdragon。并把该类添加到Spring的IOC容器中。
第四步:校验数据。添加数据校验Validated注解,开启数据校验,测试其是否支持数据校验的功能;
第五步:测试ConfigurationProperties注解是否支持SpEL表达式;
导入依赖:pom.xml 添加 spring-boot-configuration-processor依赖
org.springframework.boot
spring-boot-configuration-processor
true
配置数据:application.yml 配置属性参数,nick-name是用来判断匹配属性的松散性,若换成nick_name依然可以获取值。
itdragon:
nick-name: ITDragonBlog
email: 1234567890@qq.com
iphone: 1234567890
abilities: [java, sql, html]
created_date: 2018/03/31 15:27:30 匹配和校验数据:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
* ConfigurationProperties 注解语法类
* 第一步:导入依赖 spring-boot-configuration-processor;
* 第二步:把ConfigurationProperties注解修饰的类添加到Spring的IOC容器中;
* 第三步:设置prefix属性,指定需要注入属性的前缀;
* 第四步:添加数据校验注解,开启数据校验;
*
* 注意点:
* 一、nickName和createdDate在yml配置文件中,对应参数分别是中划线和下划线,用于测试其对属性名匹配的松散性
* 二、email和iphone 测试其支持JSR303数据校验
* 三、abilities 测试其支持复杂的数据结构
*/
@Component
@ConfigurationProperties(prefix = "itdragon")
@Validated
public class ConfigurationPropertiesEntity {
private String nickName; // 解析成功,支持松散匹配属性
private String email;
// @Email // 解析失败,数据校验成功:BindValidationException: Binding validation errors on itdragon
private String iphone;
private List abilities;
private Date createdDate; // 解析成功,支持松散匹配属性
// @ConfigurationProperties("#{(1+2-3)/4*5}")
private String operator; // 语法报错,不支持SpEL表达式:not applicable to field
// 省略getter,setter,toString方法
} 三)@Value详解
上一篇博客已经介绍过Value注解的使用,这里只简单说明。
第一步:在属性上添加Value注解,通过${}设置参数从配置文件中注入值;
第二步:修改 ${itdragon.ceatred_date} 中的参数值,改为 ${itdragon.ceatredDate} 测试是否能解析成功;
第三步:添加数据校验Validated注解,开启数据校验,测试其是否支持数据校验的功能;
第四步:测试Value注解是否支持SpEL表达式;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
* Value 注解语法类
* 第一步:在属性上添加注解Value注入参数
* 第二步:把Value注解修饰的类添加到Spring的IOC容器中;
* 第三步:添加数据校验注解,检查是否支持数据校验;
*
* 注意点:
* 一、nickName和createdDate在yml配置文件中,对应参数分别是中划线和下划线,用于测试其对属性名匹配的松散性
* 二、email和iphone 测试其支持JSR303数据校验
* 三、abilities 测试其支持复杂的数据结构
*
* 结论:
* 一、createDate取值必须和yml配置文件中的参数保持一致,
* 二、既是在iphone上添加邮箱验证注解依然可以通过测试,
* 三、不支持复杂的数据结构,提示错误和第一条相同:IllegalArgumentException: Could not resolve placeholder 'itdragon.abilities' in value "${itdragon.abilities}"
*/
@Component
@Validated
public class ValueEntity {
@Value("${itdragon.nick-name}")
private String nickName;
@Value("${itdragon.email}")
private String email;
@Email
@Value("${itdragon.iphone}") // 解析成功,并不支持数据校验
private String iphone;
// @Value("${itdragon.abilities}") // 解析错误,并不支持复杂的数据结构
private List abilities;
// @Value("${itdragon.ceatredDate}") // 解析错误,并不支持松散匹配属性,必须严格一致
private Date createdDate;
// Value注解的强大一面:支持SpEL表达式
@Value("#{(1+2-3)/4*5}") // 算术运算
private String operator;
@Value("#{1>2 || 2 <= 3}") // 关系运算
private Boolean comparison;
@Value("#{systemProperties['java.version']}") // 系统配置:os.name
private String systemProperties;
@Value("#{T(java.lang.Math).abs(-18)}") // 表达式
private String mapExpression;
// 省略getter,setter,toString方法
} 四)配置文件取值小结
一、ConfigurationProperties注解支持批量注入,而Value注解适合单个注入;
二、ConfigurationProperties注解支持数据校验,而Value注解不支持;
三、ConfigurationProperties注解支持松散匹配属性,而Value注解必须严格匹配属性;
四、ConfigurationProperties不支持强大的SpEL表达式,而Value支持;
四、配置文件占位符
占位符和随机数比较简单,这里就直接贴出代码。需要注意的是:
一、占位符的值必须是完整路径
二、占位符设置默认值,冒号后面不能有空格
ran: # 这里的prefix不能是random,
ran-value: ${random.value}
ran-int: ${random.int}
ran-long: ${random.long}
ran-int-num: ${random.int(10)}
ran-int-range: ${random.int[10,20]}
ran-placeholder: placeholder_${ran.ran-value:此处不能有空格,且key为完整路径} import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 随机数和占位符语法类
*/
@Component
@ConfigurationProperties(prefix = "ran")
public class RandomEntity {
private String ranValue; // 随机生成一个字符串
private Integer ranInt; // 随机生成一个整数
private Long ranLong; // 随机生成一个长整数
private Integer ranIntNum; // 在指定范围内随机生成一个整数
private Integer ranIntRange;// 在指定区间内随机生成一个整数
private String ranPlaceholder;// 占位符
// 省略getter,setter,toString方法e
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootYmlApplicationTests {
@Autowired
private UserInfo userInfo;
@Autowired
private YamlEntity yamlEntity;
@Autowired
private ConfigurationPropertiesEntity configurationPropertiesEntity;
@Autowired
private ValueEntity valueEntity;
@Autowired
private RandomEntity randomEntity;
@Test
public void contextLoads() {
// System.out.println("YAML Grammar : " + yamlEntity);
// System.out.println("UserInfo : " + userInfo);
// System.out.println("ConfigurationProperties Grammar : " + configurationPropertiesEntity);
// System.out.println("Value Grammar : " + valueEntity);
System.out.println("Random Grammar : " + randomEntity);
}
} 以上是“Spring Boot配置文件的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
当前名称:SpringBoot配置文件的示例分析
网站URL:http://cdweb.net/article/ieshji.html