从零开始 Spring Boot 31:Spring 表达式语言

本文介绍了Spring Expression Language (SpEL) 的核心概念,包括评估、EvaluationContext、解析器配置和编译器。SpEL支持在运行时查询和操作对象图,提供强大的表达式能力,如方法调用、属性访问和构造器。文章通过实例展示了SpEL的使用,如bean定义中的表达式和构造器参数。此外,还探讨了如何配置编译器以优化性能。
摘要由CSDN通过智能技术生成

从零开始 Spring Boot 31:Spring 表达式语言

spring boot

图源:简书 (jianshu.com)

Spring表达式语言(Spring Expression Language,简称 “SpEL”)是一种强大的表达式语言,支持在运行时查询和操作对象图。该语言的语法与统一EL相似,但提供了额外的功能,最显著的是方法调用和基本的字符串模板功能。

评估

直接看一个简单示例:

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'");
String value = (String) expression.getValue();
System.out.println(value);

SpelExpressionParser是一个Spel表达式解析器,主要实现了ExpressionParser接口:

package org.springframework.expression;

public interface ExpressionParser {
   
    Expression parseExpression(String expressionString) throws ParseException;
    Expression parseExpression(String expressionString, ParserContext context) throws ParseException;
}

org.springframework.expression是Spring中SpEL相关功能的包。

ExpressionParser.parseExpression()可以解析SpEL表达式并返回一个Expression对象。这里的'Hello World'是一个简单的字面量,所以最后的输出的是:

Hello World

Expression.getValue()方法可以获取表达式“评估”(Evaluation)后的值,这个值的类型是Object,需要进行转换。

如果评估失败,会抛出一个EvaluationException异常:

public interface Expression {
   
    @Nullable
    Object getValue() throws EvaluationException;
	// ...
}

在SpEL中,还可以调用方法:

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.concat('!')");
String value = expression.getValue(String.class);
System.out.println(value);

这里调用了String.concat()方法进行字符串连接,最后的输出是:

Hello World!

此外,示例中使用了一个泛型版本的getValue()方法,通过传入一个目标类型的Class对象,可以直接获取相应类型的结果,不用进行强制类型转换。

类似的,SpEL中也可以使用对象属性:

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.bytes");
byte[] bytes = (byte[]) expression.getValue();
System.out.println(Arrays.toString(bytes));

输出结果:

[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

对属性也可以用.进行级联操作

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.bytes.length");
Integer value = (Integer) expression.getValue();
System.out.println(value);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值