关于springboot:SpringBoot基础系列Value-之字面量及-SpEL使用知识点介绍篇

34次阅读

共计 3583 个字符,预计需要花费 9 分钟才能阅读完成。

【SpringBoot 根底系列】@Value 之字面量及 SpEL 知识点介绍篇

承接上一篇博文【SpringBoot 根底系列】@Value 中哪些你不晓得的知识点 中提及到但没有细说的知识点,这一篇博文将来看一下 @Value 除了绑定配置文件中的属性配置之外,另外反对的两种姿态

  • 字面量表达式反对
  • SpEL 语法反对

<!– more –>

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);
    }
}

4. 小结

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

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

借助 SpEL 的弱小性能,齐全能够施展咱们的脑洞,让 @Value 润饰的属性初始化不再局限于简略的配置文件,比方从 db,redis,http 获取齐全是可行的嘛,无非就是一个表达式而已

当然这里还存在一个待解决的问题,就是值刷新的反对,已知 @Value 只在 bean 初始化时执行一次,后续即使配置变更了,亦不会从新更改这个值,这种设计有好有坏,益处很显著,配置的不变性能够省去很多问题;毛病就是不灵便

那么如何让 @Value 的配置能够动静刷新呢?

咱么下篇博文见,我是一灰灰,欢送关注长草的公众号 一灰灰 blog

III. 不能错过的源码和相干知识点

0. 我的项目

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/002-properties-value

配置系列博文

  • 【SpringBoot 根底系列】自定义配置源的应用姿态介绍
  • 【SpringBoot 根底系列】@Value 中哪些你不晓得的知识点
  • 【SpringBoot 根底系列】ConfigurationProperties 配置绑定中那些你不晓得的事件
  • 【SpringBoot 根底系列】SpringBoot 配置篇之 PropertySource 加载 Yaml 配置文件实例演示
  • 【SpringBoot 根底系列】实现一个自定义配置加载器(利用篇)
  • SpringBoot 根底篇配置信息之配置刷新
  • SpringBoot 根底篇配置信息之自定义配置指定与配置内援用
  • SpringBoot 根底篇配置信息之多环境配置信息
  • SpringBoot 根底篇配置信息之如何读取配置信息

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因集体能力无限,不免有疏漏和谬误之处,如发现 bug 或者有更好的倡议,欢送批评指正,不吝感谢

上面一灰灰的集体博客,记录所有学习和工作中的博文,欢送大家前去逛逛

  • 一灰灰 Blog 集体博客 https://blog.hhui.top
  • 一灰灰 Blog-Spring 专题博客 http://spring.hhui.top

正文完
 0