返回顶部
首页 > 资讯 > 后端开发 > Python >基于springEL表达式详解及应用
  • 595
分享到

基于springEL表达式详解及应用

2024-04-02 19:04:59 595人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录基于springEL表达式详解及应用什么是SpringEL?为什么要使用SpringEL?如何使用SpringEL?使用SpringEL注入简单值使用SpringEL调用方法Sp

基于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,适当的技术方在适当的位置,才能更好的完成事情。

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

--结束END--

本文标题: 基于springEL表达式详解及应用

本文链接: https://lsjlt.com/news/133102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于springEL表达式详解及应用
    目录基于springEL表达式详解及应用什么是SpringEL?为什么要使用SpringEL?如何使用SpringEL?使用SpringEL注入简单值使用SpringEL调用方法Sp...
    99+
    2024-04-02
  • SpringBoot SpringEL表达式的使用
    目录一、SpringEL-基础介绍二、EL表达式-基础使用三、SpringEL-基础使用四、属性自动注入一、SpringEL-基础介绍 什么是SpringEL(SpEL)? ...
    99+
    2024-04-02
  • MapStruct表达式应用及避坑详解
    目录前言遇到的问题发现原因结语前言 生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解。MapStruct的表达式功能是为了处理特殊对象属性的映射问题,比如DTO中的s...
    99+
    2024-04-02
  • 基于Arrays.sort()和lambda表达式
    目录Arrays.sort()和lambda表达式1、对基本数据类型数组的排序2、给对象数组排序再谈Comparator-使用lambda表达式以前现在Arrays.sort()和l...
    99+
    2024-04-02
  • Java中Lambda表达式使用及详解
    Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加...
    99+
    2023-08-16
    java
  • Python正则表达式的应用详解
    目录正则表达式的定义Python对正则表达式的支持示例例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成例2:从字符串中找到与正则表达式匹配的部分例3:从...
    99+
    2024-04-02
  • C++ 正则表达式的应用详解
    目录一、为什么要学正则表达式C++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式...
    99+
    2024-04-02
  • JSP之EL表达式基础详解
    一、EL表达式简介 EL表达式全称:Expression Language,即表达式语言 EL表达式作用:代替JSP页面中表达式脚本进行数据的输出 EL表达...
    99+
    2024-04-02
  • 基于Java的正则表达式
    正则表达式概念 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则...
    99+
    2023-05-31
    java 正则表达式 ava
  • C# LINQ查询表达式及对应LAMBDA表达式的用法
    目录首先先让我们看一下什么是LINQ查询表达式和Lambda表达式:什么是“延迟执行”?还是上面例子中的查询:并行linqC#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段...
    99+
    2024-04-02
  • Javascript中正则表达式的应用详解
    目录stringsearchreplacematch:RegExp总结正则表达式 在前端中的应用也是比较常见的,我们在有时候也需要 用js 对某些字符串进行查找\捕获 或者 替换. ...
    99+
    2024-04-02
  • 关于@Scheduled参数及cron表达式解释
    目录@Scheduled参数及cron表达式解释@Scheduled支持以下8个参数cron表达式是一个字符串,以空格分开共6个域通配符说明常用表达式示例@Scheduled 定时任...
    99+
    2024-04-02
  • 正则表达式基本语法详解
    正则表达式是一种描述字符串模式的方法,可以用来匹配、查找和替换字符串。它是一种强大而灵活的工具,在文本处理和模式匹配中广泛应用。正则...
    99+
    2023-08-15
    正则表达式
  • Java中Lambda表达式基础及使用
    目录一、举例说明1、无参无返回1.1 定义一个接口1.2接口实现类1.3 测试类2、有参无返回代码示例3、有参有返回二、简单事项1、省略模式2、注意事项三、Lambda表达式和匿名内部类的区别1、所需类型不同:2、使用限制不同:3、实现原理...
    99+
    2019-12-07
    Java Lambda表达式 Java Lambda
  • Python中使用正则表达式及正则表达式匹配规则详解
    目录1 导库2 使用模板3 说明4 示例5 正则表达式匹配规则1 导库 import re 2 使用模板 re_pattern = re.compile(pattern, flags...
    99+
    2023-03-22
    Python正则表达式匹配规则 Python正则表达式
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • JavaLambda表达式详解
    Java Lambda表达式是JDK8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数...
    99+
    2023-02-18
    Java Lambda表达式详解 Java Lambda表达式创建线程 Java Lambda表达式的语法 Java lambda遍历List集合 Java lambda过滤String
  • Java正则表达式基础语法详解
    目录什么是正则表达式?字符范围匹配:元字符:多次重复匹配:定位匹配:总结什么是正则表达式? 1、正则表达式是检擦、匹配字符串的表达式 2、正则表达式是描述规则,主流语言都有良好支持...
    99+
    2024-04-02
  • 正则表达式用法详解
    正则表达式之基本概念 在我们写页面时,往往需要对表单的数据比如账号、身份证号等进行验证,而最有效的、用的最多的便是使用正则表达式来验证。那什么是正则表达式呢? 正则表达式(Regul...
    99+
    2024-04-02
  • JavaScript中正则表达式的实际应用详解
    实际工作中,JavaScript正则表达式还是经常用到的。所以这部分的知识是非常重要的。 一、基础语法: 第一种:字面量语法 var expression=/pattern/f...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作