字符串模板解析

背景

在我们平时开发过程中可能会经常遇到将一个对象里面的一个或者多个属性拿出来跟一个字符串模板拼接成一个新的字符串。

例如有一个这样的需求,后台处理完成了一个订单(订单分配到快递员了),这个时候就需要发一条通知给用户,这种通知想必大家都收到过格式如: 【xxx市】配送员xxx xxx 正在为你派送,感谢你的耐心等待。

可能大家遇到的各种各样的都有。

如何做这么一个功能

先说一下我看到的一些做法

// 在配置中心,或者一个平台维护一个字符串模板(总之在一个地方维护,不是写死在代码里面)
// 代码中获取到这条模板
String template = "【%s市】配送员%s %s 正在为你派送,感谢你的耐心等待。";
String value = String.format(template, "深圳", "张三", "18622221111");

// 或者自己定义了一个工具类,模板这样写
String template = "【{0}市】配送员{1} {2} 正在为你派送,感谢你的耐心等待。";
List<String> param = Arrays.asList("深圳", "张三", "18622221111");
String value = TemplateUtils.format(template, param);

// 这两种方式我觉得都不是很灵活,可读性差,拼接多了自己也会晕

我们可以使用模板引擎,例如 Velocity、FreeMarker、Thymleaf、Beetl、Enjoy

我觉使用模板引擎有2个问题:

1、过于庞大,而我们只是一个字符串拼接没必要

2、不会使用(需要学习)

如何基于Spring的SpEL处理

做Java开发,相信Spring大家都很熟悉,对于SpEL(Spring Expression Language) 估计也使用过,例如:

1、占位符解析: ${application.name}
2、SpEL: #{person.name} #{1+2}

SpEL更多介绍参考Spring官方文档: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions

相信看到这里的,不管是占位符,还是SpEL都比上面的那种类似字符串拼接的更好用吧。

String template = "【${city}市】配送员${name} ${phone} 正在为你派送,感谢你的耐心等待。";

我们要使用Spring的SpEL跟占位符解析还是比较麻烦,这里我封装了一个类让我们可以方便的使用占位符解析与SpEL功能,代码地址:https://github.com/myszh/java-code-samples/blob/main/core/src/main/java/com/myszh/samples/core/StringTemplateResolver.java

功能介绍:

  • 支持Map来解析占位符
  • 支持Java 对象来解析占位符
  • 嵌套解析,解析后的值还是一个占位符,可以继续解析,非模板嵌套:${name${age}}
  • 使用默认值,如果占位符未解析可以使用默认值:${name:zhang san}
  • 非严格模式(无法解析的原样返回)
  • 严格模式(遇到无法解析的抛出异常)
  • Map,Java bean都支持SePL
  • 支持懒加载

使用方式代码参考:https://github.com/myszh/java-code-samples/blob/main/core/src/test/java/com/myszh/samples/core/StringTemplateResolverTest.java

总结

我们在使用过程中先准备一个模板,然后准备一个MultiContext(解析的上下文,里面添加各种java bean)可以用 Supplier contextProvider来达到懒加载的效果,这样我们改动模板时只要我们模板中使用的数据在 MultiContext中只需要修改模板而无需修改代码,当然如果你模板要用到的数据不在MultiContext中没有那么还是要改代码的,不过这样改起来也方便,只需要向里面添加相关的java bean(数据)就行。

posted @   wdszh  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示