文章目录

  • 1、String类型
  • 2、Array类型
  • 3、List/Set集合类型
  • 4、 Map类型
  • 5、ConfigurationProperties
  • 6、附加
  • 7、结束语

博主正在开心的准备看英雄联盟季后赛 FPX和RNG的比赛,这时候女朋友林妹妹走过来

林妹妹:我最近在学习spring,现在学到了数据绑定@Value这个注解,学的不是很明白,你能给我讲讲吗?

博主:等一会哈,我看完比赛

林妹妹:纳尼?

博主:你听错的我时候的马山开始,看什么比赛(害怕中…)

准备好了吧,咱们先从简单类型开始

1、String类型

首先我们创建一个spring boot项目,不会的可以看下博主的另一篇文章idea创建Springboot 2.X项目

然后在application.yaml中配置如下内容

chilx:person:name: chilxage: 18

接着我们就是可以使用这两个参数了

创建个一个Person类,使用就可以使用@Value注解了

@Value("${chilx.person.name}")
private String name;@Value("${chilx.person.age}")
private Integer age;

林妹妹:好的那我试下

过了一会--------

林妹妹:不对呀我这里项目报错呀

博主:我看看,(瞟了一眼后)你呀你真是个小笨蛋,你看看错误提示,你使用的没有声明的参数

这一点我忘了和你说当我们使用@Value引用没有声明的参数时会报报错的哦

例如 gender 这个属性在配置文件中没有声明,我们在Perso类中添加一下内容

@Value("${chilx.person.gender}")
private String gender;

启动项目会报以下的错误

林妹妹:那有没有解决的方法呀?

当然是有的呀,我们在引用属性的时候可以给一个默认值,当属性不存在的时候就赋值其默认值

我们改造下刚才的内容,在引用参数的后面加上冒号和默认值就可以了

// 默认值为空串
@Value("${chilx.person.gender:}")
private String gender1;
// 默认值为null
@Value("${chilx.person.nikeName:null}")
private String gender2;
// 默认值为 男
@Value("${chilx.person.password:'男'}")
private String gender3;

这个是刚才的问题就迎刃而解了

好了,@Value的基本使用就说完了,你还有什么不明白的吗?

林妹妹:没有了,现在基本的使用我已经明白了

博主:好,那下面我们继续

2、Array类型

接下来我们来看下数组类型

配置文件添加一下配置

chilx:person:....hobbies: 篮球, 足球, 游戏

Person类中添加

@Value("${chilx.person.hobbies}")
private String[] hobbies;

然后就可以了,简单吧

林妹妹:嗯嗯,简单简单,套路我都知道了

博主:看把你厉害的,继续继续

3、List/Set集合类型

接下来我们来学习下集合类型,List和Set使用是一样的,只是Set会去重

继续在application.yaml 中添加配置

chilx:person:....friend: 小明, 小红

林妹妹:我知道一下怎么做了,这不是和Array类型的一样么,谁还不会,不就是在Person类中添加,以下内容不就行了

@Value("${chilx.person.friend}")
private List<String> friend;

得意的启动项目中… 执行成功

怎么样,我厉害吧

博主:厉害厉害,你也知道当属性不存在的时候直接引用属性是会报错的,集合类型你知道怎么

林妹妹:这个,这个不知道耶(小声)

博主:哈哈哈,看你还得嘚瑟不,这下知道自己的不足了吧

林妹妹:哎呀,不要说我了,快给我讲讲怎么处理呀

博主:好的,好的,这就给你说不要打我了,你要好好看看下面的代码, 大致可以分为以下几种情况

// 默认值 []
@Value("${chilx.person.friend1:}")
private List<String> friend1;// 默认值 [null]
@Value("${chilx.person.friend1:null}")
private List<String> friend2;
// 默认值 [小明,小红]
@Value("${chilx.person.friend1:小明,小红}")
private List<String> friend3;// 以下是使用的EL表达式
// 默认值 []
@Value("#{'${chilx.person.friend1:}'.split(',')}")
private List<String> friend4;// 默认值 [null]
@Value("#{'${chilx.person.friend1:null}'.split(',')}")
private List<String> friend5;// 默认值 [小明,小红]
@Value("#{'${chilx.person.friend1:小明,小红}'.split(',')}")
private List<String> friend6;// 默认值 []
@Value("#{'${chilx.person.friend1:,}'.split(',')}")
private List<String> friend7;

林妹妹:懂了,懂了原来是这样的。咦,不对呀,Array类型的你怎么没给我讲默认值呀的问题呀

博主:想起来了呀,我以为你忽略了这个问题那

林妹妹:怎么你在怀疑我????

博主:不敢不敢,前面我之所以没说是以为Array,List和Set在默认值方面是一样的,知道了啵

其实集合类型还有其他几种的注入类型的,只是不能使用@Value进行注解

等给你讲完Map类型在给你详细道来

来来咱们继续

4、 Map类型

接下来咱们来说说字典类型哈

林妹妹:(小声道)不都是一样的套路,谁还不知道

博主当做没听到…

首先在配置文件中添加配置

chilx:person:.....pet: "{'小狗':'旺旺', '小猫':'喵喵'}"courses: "{'语文':100, '数学':99}"

java类中添加对应的属性,注意@Value中要使用EL表达式

@Value("#{${chilx.person.pet}}")
private Map<String, String> pet;@Value("#{${chilx.person.courses}}")
private Map<String, String> courses;

这样就可以了是不是很简单

林妹妹:嗯呐

同理咱们来说下Map的默认值

// 默认值 null
@Value("#{${chilx.person.courses1:{}}}")
private Map<String, String> courses1;// 默认值 null
@Value("#{${chilx.person.courses1:null}}")
private Map<String, String> courses2;// 默认值 {k1:v1}
@Value("#{${chilx.person.courses1:{k1:'v1'}}}")
private Map<String, String> courses3;

可以看到,默认值的设置都大同小异

字典类型和集合类型一样,也是有其他的配置方式的,只是也是不支持@Value的注入方式,休息下我们继续哈

春去秋来,一晃眼十… 咳咳扯远了,继续继续

5、ConfigurationProperties

前面咱们不是讲过集合类型和字典类型还有其他的的注入方式呀,现在咱们趁热打铁学习一下

咱们现在使用的方式是批量绑定配置文件中的属性

  • pom.xml中添加相关依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
  • 新创建一个类User

    添加对应的类注解,prefix属性对应的是配置文件中的配置的层级,一直到倒数第二级

@ConfigurationProperties(prefix = "chilx.girlfriend")
  • 编写配置文件
chilx:girlfriend:name: 林妹妹age: 18hobbies: 唱歌, 跳舞friend:  迎春, 惜春pet1: 大象, 狮子pet2:- 老虎- 豹子pet3:小猫小狗courses:k1: 100k2: 100
  • 编写User类

注意:类中的属性要和配置文件中的最后一级的配置名称要一致,强一致,切记切记。如果对应的配置不存在,则属性为null

User类的具体如下

@Component
@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "chilx.girlfriend")
public class User {private String name;private Integer age;/*** 默认值为空串*/private String gender;/*** 不存在为null*/private String nikeName;/*** 默认值为 男*/private String password;private String[] hobbies;private List<String> friend;private List<String> pet1;private List<String> pet2;private List<String> pet3;private Map<String, Integer> courses;

做完上面几步就对属性绑定完成了,是不是简单

林妹妹:是挺简单,感觉比@Value方便多了,可以一次批量绑定,就是没有@Value灵活

博主:鱼和熊掌不可兼得耶

ConfigurationProperties不仅可以绑定属性连对象都可以绑定,我给你演示下

  • 在配置文件中添加以下配置
chilx:girlfriend:.....boyfriend: {name: chilx, age: 18 }
  • 在User类中添加对应属性
private Boyfriend boyfriend;

以上两步就解决了,是不是很简单,是不是很简单

@Value和ConfigurationProperties的却别

  • @Value属性填充是在bean实例化后调用populateBean(),由AutowiredAnnotationBeanPostProcessor注入填充
  • @ConfigurationProperties的属性填充,是在initializeBean时, 由ConfigurationPropertiesBindingPostProcessor注入填充

结论:如果一个字段同时被两种方式进行填充,最终填充是由@ConfigurationProperties决定

6、附加

开始我们不是说了集合类型其他方式的配置@Value不能绑定数据,这里我们演示下

配置文件添加中修改下配置

chilx:person:friend:- 迎春- 惜春

执行代码发下报错

我们先看下报错

这个错的意思不能解析咱们配置的参数,这下知道了不

7、结束语

博主:讲到现在你差不多对spring的数据绑定有了初步的认识了吧?

林妹妹:嗯嗯,谢谢哥哥

博主:傻瓜,今天我讲的的这些知识数据绑定的皮毛,还有很多高级的应用,有时间我在给你讲下

一会我把测试代码提交的github和马云你要是记不住,到时候可以参考下。

码云

github

话音刚落,博主开始的打开浏览器想看FPX和RNG的比赛,悲痛的发现已经比赛完了FPX:RNG 3:0 这个结果有点出乎意料呀。

快速的看了下回放,发下这几句都是正反手教学呀,RNG需要反思了呀,还有刘青松的瑞尔是真的强,瑞尔king呀!!!

画外音:博主你哪有什么女朋友!!!!

林妹妹问我@Value怎么使用相关推荐

  1. 农民工傻二听说林妹妹出家之后

    农民工傻二昨天在地上捡了一张破报纸上去拉屎,拉着拉着,觉得非常无聊,就蹲在那里看起了那张报纸.不看不知道,一看吓一跳.傻二发现身家两亿的林妹妹居然当尼姑去了. 傻二屎也不拉了,蹲在那里,就地展开了一番 ...

  2. 红楼主题曲提前曝光 史江月刮起“林妹妹”旋风

    红楼主题曲提前曝光 史江月刮起"林妹妹"旋风 李少红执导的新版<红楼梦>尚在拍摄就已成为聚光灯下的焦点,各类话题.争议不断.历时数月轰轰烈烈的红楼选秀硝烟才刚刚散去,剧 ...

  3. 小林和单字母.CN域名的那些事(中)

    如何做决策,信心从何来? 尴尬的问题来了,由于小林不久前才在北京购置房子支付了一笔首付,所以手头其实也很紧张,并不是一下子就能拿出20万来买下这4个单字母域名.可是为什么比前面那些更早接触到这批域名的 ...

  4. 小林和单字母.CN域名的那些事(番外篇)

    F.cn 小蛋蛋.周海川(现持有T.cm等数个单字母域名).邓世强(现持有F.cn) 小林开始做个人门户软件,P.cn单字母域名的消息透过中国站长大会传开了,很多站长好生羡慕,包括后来F.cn的新买家 ...

  5. ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘

    原文地址:http://www.cnblogs.com/edisonchou/p/3901559.html 开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件 ...

  6. 学生每日计划表_学霸宅家都干什么?浙大学生近700份居家作息计划表泄露秘密...

    钱江晚报·小时新闻 记者 王湛 通讯员 张丁源 邱伊娜 柯溢能 视频制作 徐震 计算机科学与技术专业的大二男生徐震给自己制作了酷酷的代码作息表 前些日子,浙江大学举办了一场"居家作息&quo ...

  7. 匹马行天下之思维决定高度篇——教你如何爱上“编程妹子”

    "天上掉下个林妹妹 似一朵轻云刚出岫 只道他腹内草莽人轻浮 却原来骨格清奇非俗流 娴静犹如花照水 行动好比风扶柳 眉梢眼角藏秀气 声音笑貌露温柔 眼前分明外来客 心底却似旧时友" ...

  8. java程序员_java程序员这个职业赚钱吗,看一线程序员怎么说

    java程序员这个职业赚钱吗?能赚多少钱?相信很多即将进入这个行业的年轻朋友都想问这个问题.之所以拿出一个俗不可耐的"钱"字来和大家大谈,因为这是很多朋友关心的问题. java程序 ...

  9. @propertysource 读不到properties_敢不敢来挑战,读对一班就是学霸

    点击蓝字关注我们 被人读错名字,伤自尊! 读错别人的名字,很尴尬! 然而,你有没有考虑过? 地名也是有尊严的! TA们,也不想被读错! 我们为大家精心整理了各省.市.区 最容易读错的100多个地名, ...

最新文章

  1. 互联网笔试各种主流语言在OJ上的的标准输入输出
  2. Unity电子游戏优化终极指南 The Ultimate Guide to Video Game Optimisation
  3. Linux下SSH 客户端不用输入密码配置步骤
  4. Elasticsearch中如何进行排序(中文+父子文档+嵌套文档)
  5. 三角形css_使用css绘制三角形
  6. 空间平面,空间直线及它们的方程
  7. 知识小结(浮点数问题)
  8. debian apt-get php,Debian系统apt-get命令整理
  9. git checkout切换到指定commit
  10. 链客区块链技术面试题目专题(三)
  11. tomcat配置及遇到的问题
  12. Exception:No identifier specified for entity
  13. 双输出基准电压电路/自己备忘
  14. 蘑菇街2016校园招聘——聊天
  15. 算法(一) 两圆公切线
  16. 2021福州金桥学校高考成绩查询,2021年福建高考成绩排名及成绩公布时间什么时候出来...
  17. 值得一生收藏的经典台词
  18. 计算机里FC方式,谁知道头文字D里提到的FD,FR,FC,FF指的是什么驱动方式的车?...
  19. 区块链学习笔记:区块链到底能干什么
  20. zbb20170811 linux 给用户授予文件夹权限

热门文章

  1. springboot连接redis集群
  2. spdlog开源库使用
  3. 重磅!IBM 中国研究院全面关闭
  4. UI自动化_conftest.py 配置文件的作用
  5. 基于知识图谱的语义理解技术及应用
  6. 微软IEG(创新工程组)实习面试
  7. 逐行扫描和隔行扫描的区别,原理
  8. 知乎高赞:大厂面试的2个关键点
  9. 为什么字节跳动的前端面试需要那么难的算法题?
  10. Tree Shaking