文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于springEL表达式详解及应用

2024-04-02 19:55

关注

基于springEL表达式详解及应用

什么是SpringEL?

Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JDK中提供的静态常量,获取外部Properties文件中的的配置

为什么要使用SpringEL?

我们平常通过配置文件或Annotaton注入的Bean,其实都可以称为静态性注入,试想一下,若然我Bean A中有变量A,它的值需要根据Bean B的B变量为参考,在这场景下静态注入就对这样的处理显得非常无力,而Spring3增加的SpringEL就可以完全满足这种需求,而且还可以对不同Bean的字段进行计算再进行赋值,功能非常强大

如何使用SpringEL?

SpringEL从名字来看就能看出,和EL是有点关系的,SpringEL的使用和EL表达式的使用非常相似,EL表达式在JSP页面更方便的获取后台中的值,而SpringEL就是为了更方便获取Spring容器中的Bean的值,EL使用${},而SpringEL使用#{}进行表达式的声明。

使用SpringEL注入简单值


public class TestSpringEL {
 
 
 
 // 注入简单值,输出num为5
 @Value("#{5}")
 
 private Integer num;
 
 // 注入ID为testConstant的Bean
 @Value("#{testConstant}")
 
 private TestConstant Constant;
 
 // 注入ID为testConstant Bean中的STR常量/变量
 @Value("#{testConstant.STR}")
 private String str;
}

使用SpringEL调用方法


public class TestSpringEL {
 
 
 
 // 调用无参方法
 @Value("#{testConstant.showProperty}")
 private String method1;
 
 // 有参接收字符串的方法
 @Value("#{testConstant.showProperty('Hello')}")
 private String method2;
 
 
 @Value("#{testConstant.showProperty().toUpperCase()}")
 private String method3;
 
 
 @Value("#{testConstant.showProperty()?.toUpperCase}")
 private String method4;
 
 
}

SpringEL调用静态类或常量


public class TestSpringEL {
 
 
 // 获取Math的PI常量
 @Value("#{T(java.lang.Math).PI")
 private double pi;
 
 // 调用random方法获取返回值
 @Value("#{T(java.lang.Math).random()}")
 private double ramdom;
 
 // 获取文件路径符号
 @Value("#{T(java.io.File).separator}")
 private String separator;
}

SpringEL运算


public class TestSpringEL {
 
 
 // 拼接字符串
 @Value("#{testConstant.nickname + ' ' + testConstant.name}")
 private String concatString;
 
 // 对数字类型进行运算,testConstant拥有num属性
 @Value("#{ 3 * T(java.lang.Math).PI + testConstant.num}")
 private double operation;
 
 // 进行逻辑运算
 @Value("#{testConstant.num > 100 and testConstant.num <= 200}")
 private boolean logicOperation;
 
 // 进行或非逻辑操作
 @Value("#{ not testConstant.num == 100 or testConstant.num <= 200}")
 private boolean logicOperation2;
 
 // 使用三元运算符
 @Value("#{testConstant.num > 100 ? testConstant.num : testConstant.num + 100}")
 private Integer logicOperation3;
}

SpringEL使用正则表达式


public class TestSpringEL {
 // 验证是否邮箱地址正则表达式
 @Value("#{testConstant.STR match '\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+'}")
 private boolean regularExpression;
}

SpringEL操作集合


public class TestSpringEL {
 
 
 // 获取下标为0的元素
 @Value("#{testConstant.testList[0]}")
 private String str;
 
 // 获取下标为0元素的大写形式
 @Value("#{testConstant.testList[0]?.toUpperCase()}")
 private String upperStr;
 
 // 获取map中key为hello的value
 @Value("#{testConstant.testMap['hello']}")
 private String mapValue;
 
 // 根据testList下标为0元素作为key获取testMap的value
 @Value("#{testConstant.testMap[testConstant.testList[0]]}")
 private String mapStrByTestList;
}

Spring操作外部Properties文件


<!-- 首先通过applicaContext.xml中<util:properties>增加properties文件 -->
<!-- 注意需要引入Spring的util schemea命名空间和注意id属性,id属性将在SpringEL中使用 -->
<util:properties id="test" location="classpath:application.properties"/>

public class TestSpringEL {
 // 注意test为xml文件中声明的id
 @Value("#{test['jdbc.url']}")
 private String propertiesValue;
}

SpringEL查询筛选集合和投影


public class TestSpringEL {
 
 
 // 过滤testConstant中cityList集合population属性大于1000的全部数据注入到本属性
 @Value("#{testConstant.cityList.?[population > 1000]}")
 private List<City> cityList;
 
 // 过滤testConstant中cityList集合population属性等于1000的第一条数据注入到本属性
 @Value("#{testConstant.cityList.^[population == 1000]}")
 private City city;
 
 // 过滤testConstant中cityList集合population属性小于1000的最后一条数据注入到本属性
 @Value("#{testConstant.cityList.$[population < 1000]}")
 private City city2;
 
 
 
 
 @Value("#{testConstant.cityList.?[population > 1000].![name]}")
 private List<String> cityName;
}

优点:

SpringEL功能非常强大,在Annotation的方式开发时可能感觉并不强烈,因为可以直接编写到源代码来实现SpringEL的功能,但若然是在XML文件中进行配置,SpringEL可以弥补XML静态注入的不足,从而实现更强大的注入

缺点:

SpringEL在使用时仅仅是一个字符串,不易于排错与测试,也没有IDE检查我们的语法,当出现错误时较难检测

笔者实际应用:

笔者开发的项目当中比较频繁的使用SpringEL,例如通过SpringEL获取外部properties中的值,又或者项目当中的数据字典亦是使用SpringEL的一个场景,我们抽象出一个Param类的集合,通过SpringEL集合筛选和投影获取我们想要的字段参数添加到我们的程序逻辑当中(笔者项目中的Spring Security亦使用SpringEL,但本文章不加以叙述)

总结:

Spring3.0让人为之惊艳的非SpringEL莫属,为我们的注入提供了另一种强大的形式,传统注入能做到的事情,和做不到的事情,SpringEL一概能完成,但在项目当中并不适宜大量使用SpringEL,适当的技术方在适当的位置,才能更好的完成事情。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯