IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring EL表达式用法 -> 正文阅读

[Java知识库]Spring EL表达式用法

官方文档中包含了多种用法,不再赘述:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions-language-ref

值得注意的是:使用Spring EL表达式时,最好是提前将Expression创建,否则在大量使用时影响性能。

//初始化将Expression创建,放入指定的集合里即可,比如Map
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(mxjsyRule);
map.put("xxxxx", exp);

实际应用

在做活动营销、促销活动时,会涉及多种折扣计算,使用spel表达式来优化代码。
注意:案例只注重spel表达式的使用,业务逻辑纯属虚构!!!

场景1:商品特价折扣计算

商品价格实体

//定义商品价格计算实体类
@Data
@NoArgsConstructor
static class GoodsBO {
    //商品ID
    private Long goodsId;
    //商品零售价(元)
    private BigDecimal retailPrice;
    //特价
    private BigDecimal fav;
}

定义计算规则

//商品特价折扣计算规则:特价/零售价(默认为1),四舍五入保留4位小数
public static final String bargainPriceRule = "fav.divide(retailPrice, 4, T(java.math.RoundingMode).HALF_UP)";


//如果需要非空判断,则修改规则为:
//?.表示如果该值为null,执行表达式返回null
//?:表示如果该值为null,赋默认值
public static final String bargainPriceRule = "fav?.divide(retailPrice?:new java.math.BigDecimal('1'), 4, T(java.math.RoundingMode).HALF_UP)";


//如果不需要精确计算,直接使用运算符即可:
public static final String bargainPriceRule = "fav / retailPrice";

业务处理

public static void main(String[] args) {
    ExpressionParser parser = new SpelExpressionParser();
    //传入规则
    Expression exp = parser.parseExpression(bargainPriceRule);
    //模拟商品价格实体
    GoodsBO goodsBO = new GoodsBO();
    goodsBO.setGoodsId(1L);
    goodsBO.setRetailPrice(new BigDecimal("10.2"));
    goodsBO.setFav(new BigDecimal("9"));
    BigDecimal calcResult = exp.getValue(goodsBO, BigDecimal.class);
    System.out.println(calcResult);
}

场景2:商品满赠折扣计算

商品价格实体

@Data
@NoArgsConstructor
static class GoodsBO {
    //商品ID
    private Long goodsId;
    //商品零售价(元)
    private BigDecimal retailPrice;
    //门槛
    private BigDecimal threshold;
    //优惠值
    private BigDecimal fav;
    //赠品数
    private BigDecimal giftCount;
    //赠品最大金额
    private BigDecimal giftMaxPrice;
}

定义计算规则

public static final String mxjsyRule = "retailPrice.multiply(giftCount).divide(threshold.multiply(retailPrice.multiply(giftCount).add(giftMaxPrice)), 4, T(java.math.RoundingMode).HALF_UP)";

业务处理

public static void main(String[] args) {
    ExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression(mxjsyRule);
    //模拟商品价格实体
    GoodsBO goodsBO = new GoodsBO();
    goodsBO.setGoodsId(1L);
    goodsBO.setRetailPrice(new BigDecimal("10.2"));
    goodsBO.setFav(new BigDecimal("9"));
    goodsBO.setGiftCount(new BigDecimal("5"));
    goodsBO.setThreshold(new BigDecimal("3"));
    goodsBO.setGiftMaxPrice(new BigDecimal("20.5"));
    BigDecimal calcResult = exp.getValue(goodsBO, BigDecimal.class);
    System.out.println(calcResult);
}

场景3:@Value读取配置

在读取配置时候,可指定默认值,条件判断等多种操作

@Value("${testValue?:'赋默认值'}")
private String testValue;

@Value("${testValue == 100}")
private Boolean testValue;
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:28:38  更:2022-04-26 11:30:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:31:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码