1 简介

不得不说,Spring为大家提供许多开箱即用的功能,@Value就是一个极其常用的功能,它能将配置信息注入到bean中去。即使是一个简单的功能,Spring也提供了丰富的注入类型和形式。我经常会忘记一些特别类型注入的写法,比如说数组,现在整理一下,希望以后不用再找了。

2 三种形式

使用@Value注入有三种形式,如下所示:

(1)直接写值@Value("string value")

这种方式就是直接把要注入的值字面量写在注解里,比较少用。如果要写死在注解里了,那直接定义变量的时候写死就可以了。

(2)占位符@Value("${myvalue}")

这种应该最常用,通过属性名,将值注入进来。

如果可能为空,需要设置默认值,用法:@Value("${unknown.param:defaultValue}")

(3)SpEL表达式@Value("#{someBean.someValue}")
SpEL表达式很强大,还能在属性值基础上加以运算等。

如果可能为空,需要设置默认值,用法:@Value("#{systemProperties['unknown'] ?: 'defaultValue'}")

另外,占位符形式和SpEL表达式是可以结合使用的,如下:

@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;

需要注意的,内外顺序不能倒过来,应该要#{}外面,${}在里面。

3 使用场景

对于注入的场景,主要有三种:

(1)bean声明的变量

(2)setter方法注入

(3)构造方法或其它方法的入参

例子代码如下:

//bean声明的变量
public static class MyValues {@Value("#{systemProperties['user.timezone']}")private String timeZone;
}//setter 方法中
public static class MyValues {private String timeZone;@Value("#{systemProperties['user.timezone']}")public void setTimeZone(String timeZone) {this.timeZone = timeZone;}
}//方法入参
public class MyValues {private String timeZone;@Autowiredpublic void configure(@Value("#{systemProperties['user.timezone']}") String timeZone) {this.timeZone = timeZone;}
}

4 引入配置文件

既然是注入配置属性,那就需要有配置文件。对于Springboot,引入配置文件有两种方法,一种是默认引入的application.properties,另一种则需要通过@PropertySource来引入,引入的方式如下:

@PropertySources({@PropertySource(value = "classpath:missing.properties", ignoreResourceNotFound=true),@PropertySource("classpath:config.properties")
})
public class AppConfig {//...
}

加上ignoreResourceNotFound后,即使文件找不到,也不会抛FileNotFoundException异常。

5 使用举例

现在例举一些可能使用到的例子,以后在这找就行了。

Java代码如下所示:

//直接写值
@Value("plainText")
private String plainText;//普通形式-字符串
@Value("${myValues.string}")
private String myValuesString;//普通形式-数字
@Value("${myValues.int}")
private int myValuesInt;//普通形式-布尔类型
@Value("${myValues.boolean}")
private boolean myValuesBoolean;//数组
@Value("${myValues.array}")
private String[] myValuesArray;//Map
@Value("#{${myValues.map}}")
private Map<String, String> myValuesMap;//操作系统属性
@Value("#{systemProperties['user.timezone']}")
private String timeZone;//表达式结果
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;//其它bean的属性
@Value("#{propertiesApplication.class.getName()}")
private String className;//文件资源
@Value("classpath:larry.txt")
private Resource file;//URL资源
@Value("https://www.github.com")
private Resource url;

其中,配置文件application.properties内容为:

myValues.int=99
myValues.boolean=true
myValues.string=Larry
myValues.array=my,name,is,larry
myValues.map={name: 'Larry', age: '18', city: 'Guangzhou'}

资源文件larry.txt内容为:

上善若水,水利万物而不争!

启动程序,打印以上所有属性,输出结果如下所示:

{
plainText='plainText',
myValuesString='Larry',
myValuesInt=99,
myValuesBoolean=true,
myValuesArray=[my, name, is, larry],
myValuesMap={name=Larry, age=18, city=Guangzhou},
timeZone='Asia/Shanghai',
randomNumber=19.775129662772294,
className='com.pkslow.properties.PropertiesApplication$$EnhancerBySpringCGLIB$$4d0912c',
file=上善若水,水利万物而不争!,
url=
<!DOCTYPE html>
<html lang="en">
省略html内容
</html>
}

6 总结

本文讲解了@Value注解的使用,基本上平时开发用到的都涉及了,应该不需要再找其它资料了吧。


欢迎关注公众号<南瓜慢说>,将持续为你更新...

欢迎加博主微信,做一个点赞之友,哈哈...

多读书,多分享;多写作,多整理。

Spring/Springboot:

【Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)

【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式

【Springboot】用Springboot Admin监控你的微服务应用

【Spring】Spring的定时任务注解@Scheduled原来如此简单

Java必修课:

【Java必修课】通过Value获取Map中的键值Key的四种方法

【Java必修课】HashMap性能很好?问过我EnumMap没

【Java必修课】String.intern()原来还能这么用(原理与应用)

【Java必修课】Java 8之条件断言Predicate的使用

【Java必修课】一图说尽排序,一文细说Sorting(Array、List、Stream的排序)

【Java必修课】好用的Arrays.asList也有这三个坑

【Java必修课】ArrayList与HashSet的contains方法性能比较(JMH性能测试)

【Java必修课】各种集合类的合并(数组、List、Set、Map)

【Java必修课】四类方法删除List里面的所有null值

【Java必修课】Java 8 Streams的简单介绍与入门

【Java必修课】Java 8基本类型的Stream

【Java必修课】Java 8之例说Stream的合并

【Java必修课】Java双大括号{}的初始化

【Java必修课】Java 8中map()与flatMap()在Optional和Stream中的区别

【Java必修课】如何创建和初始化一个HashMap?

【Java必修课】图说Stream中的skip()和limit()方法及组合使用

Java实例:

【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)

【Java实例】统计String单词数的三种方法

【Java实例】使用正则统计英文文章中的高频词汇

MongoDB:

【MongoDB】2019年MongoDB中文社区广州大会,干货满满的分享活动

【MongoDB】用Docker安装一个MongoDB最新版玩玩

其它:

【工具】带你飞起来的好工具Everything,极速找到你所要的文件

【运维】记一次上线前的紧急定位与修复-献上九条小经验

【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?

@value 默认值_【Spring】只想用一篇文章记录@Value的使用,不想再找其它了(附思维导图)相关推荐

  1. 2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)

    作者:bug菌 博客:CSDN.掘金.infoQ.51CTO等 简介:CSDN/阿里云/华为云/51CTO博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/ ...

  2. @override怎么加上去_不知道怎么学?java后端5年经验和技术总结(附思维导图)

    1.引言 今天的光棍节,经历了昨晚的疯狂之后,看着后台数据逐渐的趋于平稳,突然感觉身心疲惫,躺在椅子上,看着媳妇给我发的消息,同学群里在疯狂讨论昨晚的疯狂操作,身边的年轻人换了一批又一批,回想自己,毕 ...

  3. js map 排序_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...

    前言 最近和女友,咳咳...(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方 ...

  4. html将页面分成三块_导航渲染流程你真的知道从输入URL到页面展示发生了什么吗?(内附思维导图)...

    导航渲染流程 通过这篇文章当你被问到从URL输入到页面展示都发生了什么的时候,基本都能对答如流,甚至可以一直深入的说,说到面试官闭麦哈哈哈~ 以下是本文的思维导图,直接拿图「点个赞」再走吧 ~ 求求了 ...

  5. 消息推送生命周期_一套完整的APP推送体系方案|附思维导图

    写这篇文章的初衷是前几天在脉脉上看到一个问题:线上app push故障,该不该给用户发送补救推送信息? 联想到自己当初作为实习菜鸟也犯过类似的推送事故,好在补救处理尚可,最终结果不错.这次仔细看了问题 ...

  6. kafka session.timeout.ms 是指消费一条数据的时间?_干货 | Kafka 内核知识梳理,附思维导图...

    前面我们已经分享过几篇Kafka的文章,最近简单梳理了下Kafka内核相关的知识,涵盖了Kafka架构总结,副本机制,控制器,高水位机制,日志或消息存储,消息发送与消费机制等方面知识.文末含对应的Ka ...

  7. java类与接口思维导图_详解java接口基础知识附思维导图

    接口: 官方的含义是---->java接口是一系列方法的声明,是一些方法特征的集合 疑问: 那为什么不用抽象类呢?把他们共有的方法集合起来放在一个抽象类里面,同样可以调用哇,但是反过来想一想如果 ...

  8. sql增删改查_快速搞定数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...

  9. visio思维导图模板_如何下载思维导图模板?在线教你找精美漂亮的思维导图

    成为职场的一员后,我越来越意识到,学会.掌握绘制思维导图是很重要的一件事情.很多学习.工作上的任务.难题,以思维导图的方式汇总.整理出来以后,会变得简单许多.因此,在学习.工作之余,我常常自主学习脑图 ...

  10. sql增删改查_面试速记之数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实.下面是关于 ...

最新文章

  1. windows更新不支持的硬件_Win10五月大更新细节,解决高CPU占用,不支持AMD
  2. 使用Identity Server 4建立Authorization Server (1)
  3. [CSA35G][XSY3318]Counting Quests (DP)
  4. 第一款Micropython图形化编辑器—Python Editor
  5. python字典类型可迭代_核心数据类型--字典
  6. 转: Syslog协议介绍
  7. 鸿蒙能兼容java吗,鸿蒙系统能不能兼容windows的所有应用软件?
  8. Matlab实现图像高斯滤波(公开代码)
  9. cashfiesta网上赚钱
  10. C# 压缩和修复Access数据库
  11. 数模转换器(DAC)——百度百科
  12. 前后端分离之图片上传服务端处理方法(亲测通过)
  13. 浮点数为什么不精确?
  14. slim的train
  15. Sobel和Roberts算子的推导过程
  16. 联想Phab2 Pro Tango手机测评
  17. 基于博客标签的多标签分类器(multi-label classification)
  18. 吾父马达加斯加之旅-2
  19. hdmi接口线_HDMI接口不可以传输音频吗?带你快速了解HDMI接口
  20. 用Axure RP 9制作简易网易云首页

热门文章

  1. 使用pjsip传输已经编码的视频,源码在github
  2. MotionEstimate运动估计综述
  3. linux内核奇遇记之md源代码解读之四
  4. opengl es3.0游戏开发学习笔记2--绘制地月星系
  5. vue 中watch函数名_vue中watch的使用
  6. python编写学生管理系统设计感想-python案例----学生管理系统(实现学员的增删改查功能)...
  7. 4207. 最长合法括号子序列
  8. 3802.消灭数组-AcWing题库
  9. python zip函数小结
  10. 回文数 详解(C++)