SpringBoot基础系列@Value 之字面量及 SpEL使用知识点介绍篇

简介: 承接上一篇博文【SpringBoot 基础系列】@Value 中哪些你不知道的知识点 中提及到但没有细说的知识点,这一篇博文将来看一下@Value除了绑定配置文件中的属性配置之外,另外支持的两种姿势

image.png


承接上一篇博文【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 与配置绑定的嵌套使用,来稍微调整下上面的实现(实际上下面这种用法也不常见,虽然没问题,但这种代码就属于写时一时爽,维护火葬场了 🙄)


/**
 * 调用静态方法
 */
@Value("#{T(com.git.hui.boot.properties.value.config.SpelProperties).uuid('${auth.jwt.token}_')}")
private String spelStaticMethod;
public static String uuid(String prefix) {
    return prefix + UUID.randomUUID().toString().replaceAll("_", ".");
}
复制代码


关于嵌套使用,下面再给出一个基础的使用姿势,供打开思路用

/**
 * 嵌套使用,从配置中获取值,然后执行SpEL语句
 */
@Value("#{'${auth.jwt.token}'.substring(2)}")
private String spelLen;
复制代码


2.4 Bean 方法调用


最后再来一个访问 bean 的方法的 case


定义一个 Service

@Service
public class RandomService {
    private AtomicInteger cnt = new AtomicInteger(1);
    public String randUid() {
        return cnt.getAndAdd(1) + "_" + UUID.randomUUID().toString();
    }
}
复制代码


一个使用的姿势如下

/**
 * bean 方法访问
 */
@Value("#{randomService.randUid()}")
private String spelBeanMethod;
复制代码


3. 测试


最后给出一个注入的结果输出,查看下有没有什么偏离预期的场景


@RestController
@SpringBootApplication
public class Application {
    @Autowired
    private SpelProperties spelProperties;
    @GetMapping("spel")
    public SpelProperties showSpel() {
        return spelProperties;
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}
复制代码


image.png


4. 小结


本篇博文主要介绍了@Value除了绑定配置文件中的配置之外,另外两种常见的 case

  • 字面量
  • SpEL 表达式:定义在#{}里面


借助 SpEL 的强大功能,完全可以发挥我们的脑洞,让@Value修饰的属性初始化不再局限于简单的配置文件,比如从 db,redis,http 获取完全是可行的嘛,无非就是一个表达式而已


当然这里还存在一个待解决的问题,就是值刷新的支持,已知@Value只在 bean 初始化时执行一次,后续即便配置变更了,亦不会重新更改这个值,这种设计有好有坏,好处很明显,配置的不变性可以省去很多问题;缺点就是不灵活


那么如何让@Value的配置可以动态刷新呢?


咱么下篇博文见,我是一灰灰



目录
打赏
0
0
0
0
13
分享
相关文章
SpringBoot的@Value注解如何设置默认值
SpringBoot的@Value注解如何设置默认值
423 1
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
|
8月前
|
springboot字段注入@value细节
springboot字段注入@value细节
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
279 3
Springboot 中引入 SpEL,复杂权限控制轻松搞定,非常优雅!
Springboot 中引入 SpEL,复杂权限控制轻松搞定,非常优雅!
163 1
SpringBoot @Value 读取配置,太强大了
SpringBoot @Value 读取配置,太强大了
67 0
SpringBoot使用@Value给静态变量注入值
SpringBoot使用@Value给静态变量注入值
349 1
SpringBoot静态属性赋值:@Value注入静态属性
SpringBoot静态属性赋值:@Value注入静态属性
293 0
SpringBoot自定义redisTemplate的key和value的序列化方式
SpringBoot自定义redisTemplate的key和value的序列化方式
188 0
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
69 10

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等