详解Spring中Spel表达式和el表达式的区别

 更新时间:2023年07月27日 08:24:31   作者:G探险者  
在 Java 开发中,表达式语言是一种强大的工具,而SpEL 表达式与EL 表达式是我们常常遇到两种表达式语言,下面我们就来看看它们的具体使用与区别吧

在翻看源码的时候,看到项目里有人实现了缓存功能,这个缓存里面值的存放与获取是通过一个路径表达式来获取的,而这个路径表达式实际是基于对Spel表达式的一些封装。出于对这个表达式的好奇,于是有了如下的,探索。

在 Java 开发中,表达式语言(Expression Language)是一种强大的工具,它允许我们在运行时动态地计算和操作对象的属性和方法。在 Spring 生态系统中,我们常常遇到两种表达式语言:SpEL 表达式(Spring Expression Language Expression)和 EL 表达式(Expression Language Expression)。这两种表达式都是为了解决 Java 开发中的灵活性和动态性问题,但在实际应用中有着不同的使用场景和功能。

1. EL 表达式

EL 表达式是 JavaEE 规范中定义的一种表达式语言,用于在 JSP、JSF 和其他 JavaEE 相关的技术中进行页面的数据绑定、表达式求值等。

EL 表达式使用 ${} 符号来引用属性值,常用于获取对象的属性值、调用对象的方法以及进行运算。

示例:

// 定义一个对象
public class Person {
    private String name;
    private int age;
    // getters and setters
}
// 在 JSP 页面中使用 EL 表达式获取对象的属性值
<p>Name: ${person.name}, Age: ${person.age}</p>

2. SpEL 表达式

SpEL 表达式是 Spring Framework 提供的一种表达式语言,用于在 Spring 应用中进行属性引用、条件判断、动态计算等操作。

SpEL 表达式使用 #{} 符号来引用属性值和进行表达式计算,支持更丰富和强大的语法和功能。

SpEL 支持属性、方法调用、运算符、集合操作、条件判断、正则表达式等更复杂的语法。还支持类型转换、变量引用、集合投影等高级特性。

示例:

// 在 Spring 配置文件中使用 SpEL 表达式设置属性值
<bean id="myBean" class="com.example.MyBean">
    <property name="name" value="#{person.name}" />
    <property name="age" value="#{person.age + 5}" />
</bean>
// 动态规则和条件判断
@Service
public class OrderService {
    @Value("#{orderValidator.validate(#order)}")
    private boolean isValid;
    public void processOrder(Order order) {
        if (isValid) {
            // 处理有效订单
        } else {
            // 处理无效订单
        }
    }
}

3. SpEL 与 EL 表达式的区别

上下文:EL 表达式主要用于 JavaEE 环境中进行页面数据绑定,而 SpEL 表达式作为 Spring Framework 的一部分,用于 Spring 应用中进行属性引用、条件判断、动态计算等操作。

功能和语法:SpEL 表达式相较于 EL 表达式更强大,支持更复杂的语法和功能,包括类型转换、集合操作、正则表达式等。

引用方式:EL 表达式使用 ${} 符号,而 SpEL 表达式使用 #{} 符号。这两种符号在使用场景和功能上有所区别。

4. 发散与思考

表达式 Expression 对象实际上是一种树状结构,类似于 DOM(Document Object Model)树。在解析 XML 文本时,DOM 树表示了整个 XML 文档的层次结构,允许我们对 XML 文档进行遍历和操作。

类似地,表达式在解析后通常被转换为一种类似于抽象语法树(AST)的树状结构。这种树状结构用于在运行时表示表达式的结构,允许我们对表达式进行求值和计算。

表达式的树状结构由节点组成,每个节点代表表达式中的一个操作或操作数。节点之间通过连接关系构成表达式的语法结构。在 SpEL 或其他表达式语言中,解析过程将表达式字符串解析为这种树状结构,以便在运行时进行快速求值。

类似于 DOM 树可以用于遍历和操作 XML 文档,表达式的树状结构可以用于动态计算和操作表达式。这种树状结构允许开发人员在运行时访问表达式的组成部分,并根据具体的上下文进行求值和计算,使得表达式具有更高级和更灵活的特性。

5. java中的树状结构对象都有哪些

Java 中有许多树状结构的对象,常见的包括但不限于:

DOM 树:用于表示 XML 文档的树状结构,在 Java 中通过各种 XML 解析器(如 javax.xml.parsers.DocumentBuilder)进行解析和操作。

Abstract Syntax Tree (AST):抽象语法树,通常用于表示编程语言中的代码结构,在编译器和解释器中广泛使用。

文件系统树:用于表示计算机文件系统的层次结构,Java 中可以通过 java.nio.file.Path 类来表示文件和目录的路径。

GUI 组件树:用于表示图形用户界面的组件层次结构,在 Java Swing 和 JavaFX 中都有对应的树状结构表示。

集合框架中的树集合:Java 提供了 java.util.TreeSet 和 java.util.TreeMap 等树集合,用于存储有序的元素。

5.1 树状结构的优势和特点包括

  • 层次性:树状结构的最大特点是具有层次性,它由节点和边构成,节点之间通过连接关系形成层次结构,从而形成了树的层次性。这种结构非常适合表示层级关系和嵌套结构的数据。
  • 快速查找:树状结构支持快速查找和访问数据。根据根节点和子节点之间的连接关系,可以在树中快速定位目标节点,从而提高数据查找的效率。
  • 插入和删除效率高:树状结构在插入和删除数据时通常具有较高的效率。由于节点之间的连接关系,插入和删除操作通常只需要对有限的节点进行操作,而不会影响整个数据集。
  • 有序性:在某些树状结构中,节点的排列是有序的,这使得树可以很容易地实现有序的遍历和查询。

5.2 树状结构的用途

  • 表示层次关系:树状结构非常适合表示具有层次关系的数据,如文件系统的目录结构、组织架构等。
  • 数据检索:树状结构可以用于构建索引,以提高数据的检索效率。例如,在数据库中使用 B 树来加速数据查询。
  • 编程语言解析:在编译器和解释器中,通常会使用抽象语法树(AST)来表示程序代码的结构,便于编译和执行。
  • 图形用户界面:GUI 组件树用于表示图形用户界面的组件层次结构,方便布局和事件处理。

小结:

SpEL 表达式和 EL 表达式都是 Java 开发中非常有用的表达式语言,它们都解决了动态计算和操作对象的需求。EL 表达式主要用于 JavaEE 环境的页面数据绑定,而 SpEL 表达式则在 Spring 应用中广泛应用于属性引用、条件判断、动态规则定义等。通过学习和使用这两种表达式语言,我们可以使应用程序更具灵活性和可配置性,提高开发效率,并使代码更易于维护和扩展。根据实际的开发需求和使用场景,我们可以选择合适的表达式语言来满足不同的需求。

到此这篇关于详解Spring中Spel表达式和el表达式的区别的文章就介绍到这了,更多相关Spring表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java通过底层原码了解数组拷贝

    Java通过底层原码了解数组拷贝

    一般说起数组的拷贝,首先想到的就是用循环对数组进行拷贝。但其实JAVA为我们提供了一些拷贝数组比较方便的方法,有完全拷贝的方法,也有部分拷贝的方法。接下来就一一介绍这些方法
    2022-07-07
  • elasticsearch开发中data-streams使用解析

    elasticsearch开发中data-streams使用解析

    这篇文章主要为大家介绍了elasticsearch开发中data-streams使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表实战

    Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表实战

    这篇文章主要为大家介绍了Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • spring-mybatis获取mapper的四种方式汇总

    spring-mybatis获取mapper的四种方式汇总

    这篇文章主要介绍了spring-mybatis获取mapper的四种方式汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot中的声明式事务详解

    SpringBoot中的声明式事务详解

    这篇文章主要介绍了SpringBoot中的声明式事务详解,Spring采用统一的机制来处理不同的数据访问技术的事务, Spring的事务提供一个PlatformTransactionManager的接口,不同的数据访问技术使用不同的接口实现,需要的朋友可以参考下
    2023-08-08
  • Java Druid连接池与Apache的DBUtils使用教程

    Java Druid连接池与Apache的DBUtils使用教程

    这篇文章主要介绍了Java Druid连接池与Apache的DBUtils使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • 深入理解Java遗传算法

    深入理解Java遗传算法

    这篇文章主要为大家详细介绍了Java遗传算法,本文对基因的编码采用二进制规则,分享了对Java遗传算法的理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • JVM 中的 returnAddress过程详解

    JVM 中的 returnAddress过程详解

    JVM的毕竟是个虚拟机,是一种规范,虽说符合冯诺依曼的计算机设计理念,但是他并不是实体计算机,所以他的组成也不是什么存储器,控制器,运算 器,输入输出设备,本文给大家介绍JVM 中的 returnAddress,感兴趣的朋友一起看看吧
    2022-04-04
  • SpringBoot自动配置实现流程详细分析

    SpringBoot自动配置实现流程详细分析

    这篇文章主要介绍了SpringBoot自动配置原理分析,SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点
    2022-12-12
  • SpringMVC MVC架构与Servlet使用详解

    SpringMVC MVC架构与Servlet使用详解

    MVC设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面
    2022-10-10

最新评论