继上一篇博客SpringBoot系列之YAML配置用法之后,再写一篇@Value、@ConfigurationProperties的对比博客

这两个主键都是可以获取配置文件属性的,不过是有比较大的区别的,所以本博客做一下对比,ok,继续拿上一篇博客的例子来实验

  1. ## 测试ConfigurationProperties
  2. user:
  3. userName: root
  4. isAdmin: true
  5. regTime: 2019/11/01
  6. isOnline: 1
  7. maps: {k1 : v1,k2: v2}
  8. lists:
  9. - list1
  10. - list2
  11. address:
  12. tel: 15899988899
  13. name: 上海市
  • 松散绑定(Relaxed binding)

    比如例子user: userName也可以表示为user: user-name(大写用-符号),user: username表示为user: user_name(小写用_符号),比如支持这种写法的就是支持松散绑定

例子:

将yml的配置改一下

  1. user:
  2. user-name: root

先用@ConfigurationProperties测试

  1. package org.muses.jeeplatform.bean;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Date;
  5. import java.util.List;
  6. import java.util.Map;
  7. @Component
  8. @ConfigurationProperties(prefix = "user")
  9. public class User {
  10. private String userName;
  11. private boolean isAdmin;
  12. private Date regTime;
  13. private Long isOnline;
  14. private Map<String,Object> maps;
  15. private List<Object> lists;
  16. private Address address;
  17. @Override
  18. public String toString() {
  19. return "User{" +
  20. "userName='" + userName + '\'' +
  21. ", isAdmin=" + isAdmin +
  22. ", regTime=" + regTime +
  23. ", isOnline=" + isOnline +
  24. ", maps=" + maps +
  25. ", lists=" + lists +
  26. ", address=" + address +
  27. '}';
  28. }
  29. public String getUserName() {
  30. return userName;
  31. }
  32. public void setUserName(String userName) {
  33. this.userName = userName;
  34. }
  35. public boolean isAdmin() {
  36. return isAdmin;
  37. }
  38. public void setAdmin(boolean admin) {
  39. isAdmin = admin;
  40. }
  41. public Date getRegTime() {
  42. return regTime;
  43. }
  44. public void setRegTime(Date regTime) {
  45. this.regTime = regTime;
  46. }
  47. public Long getIsOnline() {
  48. return isOnline;
  49. }
  50. public void setIsOnline(Long isOnline) {
  51. this.isOnline = isOnline;
  52. }
  53. public Map<String, Object> getMaps() {
  54. return maps;
  55. }
  56. public void setMaps(Map<String, Object> maps) {
  57. this.maps = maps;
  58. }
  59. public List<Object> getLists() {
  60. return lists;
  61. }
  62. public void setLists(List<Object> lists) {
  63. this.lists = lists;
  64. }
  65. public Address getAddress() {
  66. return address;
  67. }
  68. public void setAddress(Address address) {
  69. this.address = address;
  70. }
  71. }

Junit测试,可以读到数据

  1. User{userName='root', isAdmin=false, regTime=Fri Nov 01 00:00:00 CST 2019, isOnline=1, maps={k1=v1, k2=v2}, lists=[list1, list2], address=Address{tel='15899988899', name='上海市'}}

改一下,用@Value去读

  1. user:
  2. userName: root
  3. is-admin: true
  1. @Value("${userName}")
  2. private String userName;
  3. @Value("${is-Admin}")
  4. private boolean isAdmin;

ok,发现报错了

  1. org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'

ok,本博客例子是用application.yml配置的,对于application.properties的本博客没介绍,不过还是要随便提一下,application.properties文件的默认文件编码是utf8,所以写中文时候有时候会出现乱码问题

这时候可以修改编码:file->settings->Editor->file encodings

本博客之对比一下,这两种注解

ok,先改下配置,看看@ConfigurationProperties能获取到?

  1. user:
  2. isOnline: #{1*1}

debug了一下,发现不能正常计算

ok,验证@value

  1. @Value("#{1*1}")
  2. private Long isOnline;

junit测试,ok,@Value是支持的

  1. User{userName='null', isAdmin=false, regTime=null, isOnline=1, maps=null, lists=null, address=null}

@ConfigurationProperties验证:

  1. @AssertTrue
  2. private boolean isAdmin;

junit测试,发现可以支持

@Value验证

  1. @AssertTrue
  2. @Value("${isAdmin}")
  3. private boolean isAdmin;

验证,校验发现不起效

  • 复杂类型封装

    ok,验证@Value是否支持对象类型和list类型,在上篇博客,很显然验证了@ConfigurationProperties是支持对象类型和list类型获取的

所以,本博客验证一下@Value是否支持就可以

  1. @Value("${maps}")
  2. private Map<String,Object> maps;

junit测试,发现类型转换错误

  1. Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Map';

综上,可以归纳一下@Value和@ConfigurationProperties两种属性的区别

@ConfigurationProperties @Value
功能对比 批量注入配置文件属性 一个一个属性的注入
松散绑定 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

所以,@ConfigurationProperties适用与注入配置文件整个对应bean的全部属性,而@Value正如其名称一样,适合注入配置文件单个值

SpringBoot系列之@Value和@ConfigurationProperties的更多相关文章

  1. SpringBoot系列之@PropertySource用法简介

    SpringBoot系列之@PropertySource用法简介 继上篇博客:SpringBoot系列之@Value和@ConfigurationProperties用法对比之后,本博客继续介绍一下@ ...

  2. SpringBoot系列之学习教程汇总

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件     >> source down ...

  3. SpringBoot系列之从入门到精通系列教程

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 Spring框架:作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多, ...

  4. Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控

    前言 作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一种基准,据此可以构建更高级的工具和 ...

  5. Springboot 系列(十五)如何编写自己的 Springboot starter

    1. 前言 Springboot 中的自动配置确实方便,减少了我们开发上的复杂性,那么自动配置原理是什么呢?之前我也写过了一篇文章进行了分析. Springboot 系列(三)Spring Boot ...

  6. SpringBoot系列之集成Thymeleaf用法手册

    目录 1.模板引擎 2.Thymeleaf简介 2.1).Thymeleaf定义 2.2).适用模板 3.重要知识点 3.1).th:text和th:utext 3.2).标准表达式 3.3).Thy ...

  7. SpringBoot系列之集成Druid配置数据源监控

    SpringBoot系列之集成Druid配置数据源监控 继上一篇博客SpringBoot系列之JDBC数据访问之后,本博客再介绍数据库连接池框架Druid的使用 实验环境准备: Maven Intel ...

  8. SpringBoot系列之@PropertySource读取yaml文件

    SpringBoot系列之@PropertySource支持yaml文件读取 最近在做实验,想通过@PropertySource注解读取配置文件的属性,进行映射,习惯上用properties都是测试没 ...

  9. SpringBoot系列之配置文件占位符使用

    SpringBoot系列之配置文件占位符使用 Springboot占位符支持的有随机数和配置的值等等,本博客主要介绍的是随机数和获取属性配置值的简单用法 随机数获取 支持的写法有: ${random. ...

随机推荐

  1. JVM 调优 - jhat

    Java命令学习系列(五)——jhat 2016-01-21 分类:Java 阅读(8708) 评论(3) 阿里大牛珍藏架构资料,点击链接免费获取 jhat(Java Heap Analysis To ...

  2. Spring 梳理-MVC-前端控制器DispatchServlet及URL请求处理过程

    大多数基于java的web框架,都有前端控制器 spring mvc请求过程 1. 请求会首先发送到DispatchServlet,这是spring的前置Servlet,它会接收请求并转发给sprin ...

  3. 【福利】离散&C++&硬件一笔记合集

    离散 C++ 硬件

  4. JPG和PNG特性分析及适用范围

    个人博客: http://mcchen.club JPG的特性   ----有损压缩 1.支持摄影图像或写实图像的高级压缩,并且可利用压缩比例控制图像文件大小. 2.有损压缩会使图像数据质量下降,并且 ...

  5. VGG(2014),3x3卷积的胜利

    目录 写在前面 网络结构 multi-scale training and testing 其他有意思的点 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 VGG(2 ...

  6. 02-20 kd树(鸢尾花分类)

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  7. html5新媒体播放器标签video、audio 与embed、object

    html5里的一些新的标签,看到里面object.embed.video.audio都可以添加视频或音频文件 embed是针对非IE的浏览器的媒体播放器 video是html5出的一种新标准,但并不是 ...

  8. Making the Grade POJ - 3666

    A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would l ...

  9. MQ相关面试题

    如果你的简历中有写到MQ,那么面试官一般会问到如下几个问题,至少我在面试中经常常被问到,所以今天总结一下,有不对的地方还望多多包涵: 首先第一个问题,为什么要用MQ? 如果这个问题你都没考虑过,那么说 ...

  10. Jenkins源代码管理(SVN)

    Subversion 安装插件 1.首先将本地的自动化用例打包上传svn 2.配置jenkins源代码管理(每次执行jenkins时,会自动check-out配置地址中的代码到Jenkins的工作空间 ...