SpringBoot基础系列@Value 之字面量及 SpEL使用知识点介绍篇
Posted 一灰灰Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot基础系列@Value 之字面量及 SpEL使用知识点介绍篇相关的知识,希望对你有一定的参考价值。
承接上一篇博文【SpringBoot 基础系列】@Value 中哪些你不知道的知识点 中提及到但没有细说的知识点,这一篇博文将来看一下@Value
除了绑定配置文件中的属性配置之外,另外支持的两种姿势
- 字面量表达式支持
- SpEL 语法支持
I. 项目环境
1. 项目依赖
本项目借助SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ IDEA
进行开发
开一个 web 服务用于测试
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
II. @Value 知识点
上一篇的博文知道通过${}
可以获取配置文件中对应的配置值,接下来我们看一下另外两种常见的姿势
1. 字面量
字面量的使用比较简单,直接在@Value
注解中写常量
一个 demo 如下
@Value("1 + 2")
private String common;
上面这种初始化之后,common 的值会是 1 + 2
;如果只是这种用法,这个东西就有些鸡肋了,我直接赋值不香嘛,为啥还有这样多此一举呢?
当然现实中(至少我有限的代码接触中),纯上面这种写法的不多,更常见的是下面这种
@Value("demo_${auth.jwt.token}")
private String prefixConf;
字面量 + 配置联合使用,如我们的配置文件值为
auth:
jwt:
token: TOKEN.123
上面的 prefixConf 的取值,实际为 demo_TOKEN.123
2. SpEL 表达式
@Value 另外一个很强的使用姿势是支持 SpEL 表达式,至于 SpEL 是什么鬼,推荐查看【SpringBoot 基础系列】SpEL 语法扫盲与查询手册
2.1 基本姿势
使用姿势是 #{}
,表示这个大括弧里面的走 SpEL 表达式,如下
/**
* 字符串
*/
@Value("#{\'abcd\'}")
private String spelStr;
/**
* 基本计算
*/
@Value("#{1 + 2}")
private String spelVal3;
/**
* 列表
*/
@Value("#{{1, 2, 3}}")
private List<Integer> spelList;
/**
* map
*/
@Value("#{{a: \'123\', b: \'cde\'}}")
private Map spelMap;
上面是几个基本的 case 了,字面量,表达式,列表/Map 等,SpEL 的基本使用姿势与扫盲博文中的没有什么区别,无外乎就是在外层多了一个${}
当然如果仅仅只是介绍上面几个的话,就有点单调了,SpEL 一个比较强大的就是可以访问 bean 的属性/方法,这就给了我们很多的想像空间了
2.2 调用静态方法:
在上面这个配置类com.git.hui.boot.properties.value.config.SpelProperties
中添加一个静态方法
public static String uuid() {
return "spel_" + UUID.randomUUID().toString().replaceAll("_", ".");
}
然后我们尝试调用它
/**
* 调用静态方法
*/
@Value("#{T(com.git.hui.boot.properties.value.config.SpelProperties).uuid()}")
private String spelStaticMethod;
这样spelStaticMethod
就会是一个 "spel_"
开头的随机字符串了
请注意:如果在你的实际生产项目中,写出这样的代码,那多半意味着离找下家不远了
2.3 嵌套使用
接下来借助 SpEL 与配置绑定的嵌套使用,来稍微调整下上面的实现(实际上下面这种用法也不常见,虽然没问题,但这种代码就属于写时一时爽,维护火葬场了
以上是关于SpringBoot基础系列@Value 之字面量及 SpEL使用知识点介绍篇的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot基础篇之@Value中哪些你不知道的知识点
SpringBoot系列之@Value和@ConfigurationProperties