我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于springEL表达式详解及应用

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于springEL表达式详解及应用

基于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

基于springEL表达式详解及应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中Lambda表达式使用及详解

Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加
2023-08-16

正则表达式基本语法详解

正则表达式是一种描述字符串模式的方法,可以用来匹配、查找和替换字符串。它是一种强大而灵活的工具,在文本处理和模式匹配中广泛应用。正则表达式的基本语法包括以下几个部分:1. 字面量字符:正则表达式可以包含普通字符,它们匹配自身。例如,正则表达
2023-08-15

Python中使用正则表达式及正则表达式匹配规则详解

这篇文章主要介绍了Python中使用正则表达式以及正则表达式匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-22

Java中Lambda表达式基础及使用

目录一、举例说明1、无参无返回1.1 定义一个接口1.2接口实现类1.3 测试类2、有参无返回代码示例3、有参有返回二、简单事项1、省略模式2、注意事项三、Lambda表达式和匿名内部类的区别1、所需类型不同:2、使用限制不同:3、实现原理不同:标准格式:三要
2019-12-07

JavaScript基础之运算符与表达式详解

这篇文章主要为大家详细介绍了JavaScript中一些常见的运算符与表达式的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-16

Spring基于常用AspectJ切点表达式使用介绍

AspectJ是一个基于Java语言的AOP框架,使用AspectJ需要导入Spring AOP和AspectJ相关jar包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-20

正则表达式grep用法详解

grep是一个强大的文本搜索工具,它使用正则表达式来搜索和匹配文本。下面是grep的一些常用用法详解:1. 基本用法:grep pattern file这个命令会在文件中搜索匹配指定模式的行,并将其打印出来。pattern是一个正则表达式,
2023-08-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录