Spring (65)什么是Spring Expression Language(SpEL)

Spring Expression Language(SpEL)是一个强大的表达式语言,允许在运行时查询和操作一个对象图。SpEL是Spring框架的一个组成部分,提供了丰富的表达式用于运行时逻辑和数据操作。

SpEL 的核心功能

  • Literal Expressions(字面量表达式): 支持字符串、数字、布尔值和null。
  • Method Invocation(方法调用): 允许调用字符串的方法或者用户定义的方法。
  • Relational Operators(关系操作符): 包括标准的比较操作符(等于、不等于、大于等)。
  • Logical Operators(逻辑操作符): 包括逻辑运算符 andornot
  • Mathematical Operators(数学运算符): 支持标准的数学运算。
  • Property Access(属性访问): 允许直接访问对象的属性。
  • Array Construction(数组构造): 支持直接在表达式中定义数组。
  • Inline Lists(内联列表): 支持在表达式中定义列表。
  • Inline Maps(内联映射): 支持在表达式中定义映射。
  • Collection Selection(集合选择): 使用特定的语法从集合中选择元素。
  • Collection Projection(集合投影): 从集合的每个成员中提取信息。
  • Ternary Operator(三元运算符): 类似于Java的三元运算符。
  • Variables(变量): 支持定义和引用变量。
  • User defined functions(用户定义函数): 支持定义和调用用户自定义方法。
  • Bean References(Bean引用): 允许引用Spring容器中的Bean。
  • Array and List Indexing(数组和列表索引): 支持访问数组和集合中的元素。
  • Map Access(映射访问): 支持直接访问映射中的元素。

SpEL 使用示例

基本表达式
ExpressionParser parser = new SpelExpressionParser();

// Literal
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();

// Mathematical operator
int two = parser.parseExpression("1 + 1").getValue(Integer.class);

// Method invocation
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);

// Relational operator
boolean trueValue = parser.parseExpression("2 == 2").getValue(Boolean.class);
在Spring应用上下文中使用SpEL
<!-- 在Spring配置文件中使用SpEL -->
<bean id="sampleBean" class="com.example.SampleBean">
    <property name="number" value="#{19 + 1}"/>
    <property name="name" value="#{'Name of Bean' + ' Test'}"/>
</bean>
@Component
public class SampleBean {
    private int number;
    private String name;
    // getter和setter略
}
访问属性、调用方法和关系操作
public class Simple {
    public List<Boolean> booleanList = new ArrayList<Boolean>();
}

Simple simple = new Simple();
simple.booleanList.add(true);

EvaluationContext context = new StandardEvaluationContext(simple);

// 访问属性
Boolean trueValue = parser.parseExpression("booleanList[0]").getValue(context, Boolean.class);

// 方法调用
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);

// 关系运算
boolean trueValue = parser.parseExpression("1 < 2").getValue(Boolean.class);

深入源码

SpEL的实现依赖于几个核心类:

  • SpelExpressionParser: 解析表达式字符串,创建表达式对象。
  • StandardEvaluationContext: 定义表达式求值时使用的上下文信息。
  • SpelExpression: 表达式对象,代表解析后的SpEL表达式,可以在给定的上下文中求值。
  • PropertyAccessor: 定义访问对象属性的策略。
  • MethodResolver: 定义解析方法的策略。
解析过程

SpelExpressionParser为例,当调用parseExpression方法时,这个方法将会创建一个SpelExpression对象,并通过词法分析和语法分析(解析)过程构建表达式的AST(抽象语法树)。

public class SpelExpressionParser extends TemplateAwareExpressionParser {

    @Override
    protected SpelExpression doParseExpression(String expressionString, @Nullable ParserContext context) throws ParseException {
        // 使用Antlr来进行语法分析和生成AST
        SpelParserConfiguration config = new SpelParserConfiguration();
        SpelExpressionParser parser = new SpelExpressionParser(config);
        Expression expr = parser.parseRaw(expressionString);
        return (SpelExpression) expr;
    }
}

结论

SpEL提供了一种表达丰富、功能强大的方式来支持运行时查询和操作数据。它在Spring框架中广泛应用于配置、数据绑定和Web框架等多个领域,是Spring应用开发中不可或缺的工具之一。通过了解SpEL的架构和使用方式,开发者可以更好地利用Spring框架提供的强大功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值