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

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

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

实际应用

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

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

商品价格实体

  1. //定义商品价格计算实体类
  2. @Data
  3. @NoArgsConstructor
  4. static class GoodsBO {
  5. //商品ID
  6. private Long goodsId;
  7. //商品零售价(元)
  8. private BigDecimal retailPrice;
  9. //特价
  10. private BigDecimal fav;
  11. }

定义计算规则

  1. //商品特价折扣计算规则:特价/零售价(默认为1),四舍五入保留4位小数
  2. public static final String bargainPriceRule = "fav.divide(retailPrice, 4, T(java.math.RoundingMode).HALF_UP)";
  3. //如果需要非空判断,则修改规则为:
  4. //?.表示如果该值为null,执行表达式返回null
  5. //?:表示如果该值为null,赋默认值
  6. public static final String bargainPriceRule = "fav?.divide(retailPrice?:new java.math.BigDecimal('1'), 4, T(java.math.RoundingMode).HALF_UP)";
  7. //如果不需要精确计算,直接使用运算符即可:
  8. public static final String bargainPriceRule = "fav / retailPrice";

业务处理

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

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

商品价格实体

  1. @Data
  2. @NoArgsConstructor
  3. static class GoodsBO {
  4. //商品ID
  5. private Long goodsId;
  6. //商品零售价(元)
  7. private BigDecimal retailPrice;
  8. //门槛
  9. private BigDecimal threshold;
  10. //优惠值
  11. private BigDecimal fav;
  12. //赠品数
  13. private BigDecimal giftCount;
  14. //赠品最大金额
  15. private BigDecimal giftMaxPrice;
  16. }

定义计算规则

  1. //赠送折扣计算规则:满X件送Y:零售价 * 赠品数 / (零售价 * 赠品数 + 赠品最大金额) * 门槛,四舍五入保留4位小数
  2. public static final String mxjsyRule = "retailPrice.multiply(giftCount).divide(threshold.multiply(retailPrice.multiply(giftCount).add(giftMaxPrice)), 4, T(java.math.RoundingMode).HALF_UP)";

业务处理

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

场景3:@Value读取配置

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