无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解
在使用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属性注入使用详解相关推荐
- vue调用 webVideoCtrl.js 海康设备调试 无法获取未定义或 null 引用的属性“HWP_SubmitHttpRequest”
海康网页端开发遇到 无法获取未定义或 null 引用的属性"HWP_SubmitHttpRequest" 经过代码调试后,发现原因: 没有指定视频展示对应的div 解决方法: // ...
- SCRIPT5007: 无法获取未定义或 null 引用的属性“call”
问题 ie浏览器中打开vue项目时报错:SCRIPT5007: 无法获取未定义或 null 引用的属性"call" 解决方法 1.确保webpack版本在 2.6.1以上 2.安装 ...
- ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...
- 无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...
自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的,它包含的值可以在整个文档中重复使用.由自定义属性标记设定值(比如:--main-color: black;),由var() 函数 ...
- 【Javascript报错】无法获取未定义或 null 引用的属性“replace“
今天在处理前端字符串替换的问题中 使用了这段代码: str.replace("xx","xx") 报错 >> 是因为str没获取到 str = u ...
- 无法获取未定义或 null 引用的属性“title”_JDK中四种对象引用类型
JDK1.2之前,一个对象只有"已被引用"和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对 ...
- 使用阿里妈妈字体图标库,ie10报错,无法获取未定义或 null 引用的属性“firstChild”
前因:公司优化页面,要把彩色图片,换成字体图标. 结果:更换完后,测试发现ie10,ie9都会报错,但demo测试是没有问题的. 测试:console.log(target)为null,找到docum ...
- DataTables在IE8下报'style' 为空或不是对象错误问题 , SCRIPT5007: 无法获取未定义或 null 引用的属性“style”
网页错误详细信息: 消息: 'style' 为空或不是对象 行: 5570 字符: 5 代码: 0 检查后才发现,问题在于数组最后多了一个",",会造成Table列数计算时多了一列 ...
- JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案
JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案 参考文章: (1)JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案 (2)https://ww ...
最新文章
- 使用intelliJ创建 spring boot + gradle + mybatis站点
- Java-JUC(一):volatile引入
- Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
- Spring实战(第3版)
- 微信小程序技巧-让特定组件首页始终展示修改编译条件即可,不用改json
- .NET之生成数据库全流程
- 晨哥真有料丨常见的话题终结者与破解方法
- php漂亮按钮代码,分享一款金属感十足的按钮样式代码
- GridView表头排序方法设置
- XGBoost和GBDT的区别与联系
- Flex4 启动失败: 正在等待 Adobe Flash Player 连接调试器
- 《蜗居》100句台词 血淋淋的经典
- 交替性注意力_如何培养共同注意力(Joint Attention)——社会性发展基石
- dalao的tajan模板
- 生活中的定律——墨菲定律
- 炒鸡福利:买云服务送智能摄像头
- 【某网页在手机上可以打开,但用电脑上所有浏览器都打不开】的解决办法
- 下一代微服务!Service Mesh 2018年度总结
- python中append() extend() insert() 函数及切片增添操作的使用
- 食之无味?App Startup 可能比你想象中要简单
热门文章
- [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API
- 心里装着你,思念就很美(我要做一个文艺范儿的程序员)
- 在Eclipse中,用XFire发布web服务
- ubuntu系统设置开机自启动
- Ajax基石脚本异步并发调用参数传递
- Mybatis源码之核心流程分析
- 下列选项中不符合python语言变量命名规则的是_学习Python第二日--基本概念和类型...
- linux 编译system.img,android生成sysytem.img的命令过程
- java元数据是什么_用存储过程和 JAVA 写报表数据源有什么弊端?
- [转载] JAVA语言程序设计(基础篇)第十版课后题答案(第一章)