在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性。在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Value的使用方法。

@Value注入支持形式

@Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件的属性注入。

通过配置文件的注入根据配置文件的来源又可分为两类:一类为默认的Spring Boot会自动加载的配置文件application.properties中的属性;另一类为自定义配置文件中的属性,需要先通过@PropertySource加载。

而非配置文件注入的类型又分为:

  • 注入普通字符串
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其他Bean属性
  • 注入文件资源
  • 注入URL资源

基于配置文件注入

首先来看数据来源自配置文件的注入,无论是会被默认加载的application.properties或自定义的my.properties文件。比如,application.properties中定义属性值的形式如下:

user.name=admin

在my.properties配置文件中定义的属性如下:

user.password=pwd123

那么,@Value在Bean中的使用形式为:

@PropertySource("classpath:my.properties")@RestControllerpublic class ValueController {    /**     * 获取位于application.properties中配置的属性     */    @Value("${user.name}")    private String name;    /**     * 获取位于my.properties中的配置属性     */    @Value("${user.password}")    private String password;}

不同的是,在Spring Boot项目中,如果是自定义的my.properties文件,需要在某个类中通过@PropertySource引入该配置文件,而application.properties中的属性会自动被加载。

同时,不仅仅可以通过@Value注入单个属性,还可以注入数组和列表形式。比如如下配置:

tools=car,train,airplane

可以通过以下方式注入:

/** * 注入数组(自动根据","分割) */@Value("${tools}")private String[] toolArray;/** * 注入列表形式(自动根据","分割) */@Value("${tools}")private List toolList;

Spring默认情况下会以“,”进行分割,转换成对应的数组或列表。

基于非配置文件注入

在使用实例说明基于非配置文件注入属性的实例之前,我们先了解一下SpEL。

SpEL(Spring Expression Language)即Spring表达式语言,可以在运行时查询和操作数据。使用#{...}作为定界符, 所有在大括号中的字符都将被认为是 SpEL。

下面看具体实例场景的应用:

/** * 注入普通字符串,相当于直接给属性默认值 */@Value("程序新视界")private String wechatSubscription;/** *  注入操作系统属性 */@Value("#{systemProperties['os.name']}")private String systemPropertiesName;/** * 注入表达式结果 */@Value("#{ T(java.lang.Math).random() * 100.0 }")private double randomNumber;/** * 注入其他Bean属性:注入config对象的属性tool */@Value("#{config.tool}")private String tool;/** * 注入列表形式(自动根据"|"分割) */@Value("#{'${words}'.split('|')}")private List numList;/** * 注入文件资源 */@Value("classpath:config.xml")private Resource resourceFile;/** * 注入URL资源 */@Value("http://www.choupangxia.com")private URL homePage;

在上述示例分别展示了以下场景的使用:

  • 直接注入字符串,相当于实例化时直接初始化字符串。
  • 通过#{}注入系统属性。
  • 通过#{}注入表达式结果。
  • 通过#{}注入其他Bean的属性。
  • 通过#{}和${}的组合注入属性并进行分割处理。
  • 注入文件资源,将对应的字符串值转换成对应的资源文件。
  • 注入URL资源,将对应的URL字符串转换成URL。

其中需要注意的是:

  • Resource的全限定名为org.springframework.core.io.Resource。
  • 二者结合使用时(#{'${}'}),注意单引号,注意不能反过来。

默认值注入

无论使用#{}或${}进行属性的注入,当无法获取对应值时需要设置默认值,可以采用如下方式来进行设置。

/** * 如果属性中未配置ip,则使用默认值 */@Value("${ip:127.0.0.1}")private String ip;/** * 如果系统属性中未获取到port的值,则使用8888。 */@Value("#{systemProperties['port']?:'8888'}")private String port;

其中${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置。

本文首发来自微信公众号:程序新视界。一个软实力、硬技术同步学习的平台。

无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解相关推荐

  1. vue调用 webVideoCtrl.js 海康设备调试 无法获取未定义或 null 引用的属性“HWP_SubmitHttpRequest”

    海康网页端开发遇到 无法获取未定义或 null 引用的属性"HWP_SubmitHttpRequest" 经过代码调试后,发现原因: 没有指定视频展示对应的div 解决方法: // ...

  2. SCRIPT5007: 无法获取未定义或 null 引用的属性“call”

    问题 ie浏览器中打开vue项目时报错:SCRIPT5007: 无法获取未定义或 null 引用的属性"call" 解决方法 1.确保webpack版本在 2.6.1以上 2.安装 ...

  3. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  4. 无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...

    自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的,它包含的值可以在整个文档中重复使用.由自定义属性标记设定值(比如:--main-color: black;),由var() 函数 ...

  5. 【Javascript报错】无法获取未定义或 null 引用的属性“replace“

    今天在处理前端字符串替换的问题中 使用了这段代码: str.replace("xx","xx") 报错 >>  是因为str没获取到 str = u ...

  6. 无法获取未定义或 null 引用的属性“title”_JDK中四种对象引用类型

    JDK1.2之前,一个对象只有"已被引用"和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对 ...

  7. 使用阿里妈妈字体图标库,ie10报错,无法获取未定义或 null 引用的属性“firstChild”

    前因:公司优化页面,要把彩色图片,换成字体图标. 结果:更换完后,测试发现ie10,ie9都会报错,但demo测试是没有问题的. 测试:console.log(target)为null,找到docum ...

  8. DataTables在IE8下报'style' 为空或不是对象错误问题 , SCRIPT5007: 无法获取未定义或 null 引用的属性“style”

    网页错误详细信息: 消息: 'style' 为空或不是对象 行: 5570 字符: 5 代码: 0 检查后才发现,问题在于数组最后多了一个",",会造成Table列数计算时多了一列 ...

  9. JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案

    JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案 参考文章: (1)JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案 (2)https://ww ...

最新文章

  1. 使用intelliJ创建 spring boot + gradle + mybatis站点
  2. Java-JUC(一):volatile引入
  3. Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
  4. Spring实战(第3版)
  5. 微信小程序技巧-让特定组件首页始终展示修改编译条件即可,不用改json
  6. .NET之生成数据库全流程
  7. 晨哥真有料丨常见的话题终结者与破解方法
  8. php漂亮按钮代码,分享一款金属感十足的按钮样式代码
  9. GridView表头排序方法设置
  10. XGBoost和GBDT的区别与联系
  11. Flex4 启动失败: 正在等待 Adobe Flash Player 连接调试器
  12. 《蜗居》100句台词 血淋淋的经典
  13. 交替性注意力_如何培养共同注意力(Joint Attention)——社会性发展基石
  14. dalao的tajan模板
  15. 生活中的定律——墨菲定律
  16. 炒鸡福利:买云服务送智能摄像头
  17. 【某网页在手机上可以打开,但用电脑上所有浏览器都打不开】的解决办法
  18. 下一代微服务!Service Mesh 2018年度总结
  19. python中append() extend() insert() 函数及切片增添操作的使用
  20. 食之无味?App Startup 可能比你想象中要简单

热门文章

  1. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API
  2. 心里装着你,思念就很美(我要做一个文艺范儿的程序员)
  3. 在Eclipse中,用XFire发布web服务
  4. ubuntu系统设置开机自启动
  5. Ajax基石脚本异步并发调用参数传递
  6. Mybatis源码之核心流程分析
  7. 下列选项中不符合python语言变量命名规则的是_学习Python第二日--基本概念和类型...
  8. linux 编译system.img,android生成sysytem.img的命令过程
  9. java元数据是什么_用存储过程和 JAVA 写报表数据源有什么弊端?
  10. [转载] JAVA语言程序设计(基础篇)第十版课后题答案(第一章)