Spring SpEL
一、JVM动态语言
作用:表达式语句的动态解析。
项目中的实践:在项目开发中,遇到一种场景,需要根据公式计算数据,而涉及到很多公式,并且公式可能会有变动。因此,在开发中我就使用到了动态解析这种方案——将计算公式存到表中。能够非常灵活地计算出结果。
Java6.0 中内置集成了Mozila Rhino的JavaScript解析引擎,因此可以很方便地在Java中调用JavaScript函数。
动态求和函数:
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String scriptText = "function sum(a,b){ return a+b;}";
engine.eval(scriptText);
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("sum", 100, 99);
System.out.println(result instanceof Double);
System.out.println(result);
}
二、SpEL表达式
对于仅仅需要一些简单的表达式需求的场景,使用脚本语言显得有些“笨重”,这就是介绍SpEL表达式的原因。
-
SpEL具有显式方法调用和基本字符串模板函数等特性;
-
SpEL不直接依赖于Spring框架,可以独立使用;
可以将SpEL作为独立的动态语言使用
使用前需要引入spring-expression
:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("'hello' + ' world'");
String message= (String) expression.getValue();
System.out.println(message);
}
三、SpEL的核心接口
3.1 ExpressionParser
(1) 字符串的拼接
private static void testStrConcat(){
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("'HelloWorld'.concat('!')");
String value = (String)expression.getValue();
System.out.println(value);
System.out.println(expression.getValue(String.class));
}