SpEL即Spring Expression Language, Spring表达式语言, 能够在运行时构建复杂的表达式, 读写对象属性, 调用对象方法等等,与Spring完美契合. 赋予了Java动态功能, 利用其动态特性, 可以实现审批流等等
用法一 传递变量
@Test
public void spelBaseTest() {
// 1.创建表达式解析器
ExpressionParser parser = new SpelExpressionParser();
// 2.执行表达式,取得表达式结果
String expressionStr = "'Hello, Spel' + #ending + '\n' + " +
"'Fighting, ' + #mobileMap['huawei'] + #ending + '\n' + " +
"'Fly, ' + #collectCar[0] + #ending + '\n' + " +
"'欧力给, ' + #user.name + #ending + '\n' + " +
" new String(#number matches '\\d+')";
Expression expression = parser.parseExpression(expressionStr);
// 3.创建变量上下文,设置变量
EvaluationContext evaluationContext = new StandardEvaluationContext();
// 变量1,普通字符串
evaluationContext.setVariable("ending", "!");
// 变量2,Map类型
Map<String, String> mobileMap = Maps.newHashMap();
mobileMap.put("huawei", "华为");
mobileMap.put("xiaomi", "小米");
evaluationContext.setVariable("mobileMap", mobileMap);
// 变量3,Collection类型
evaluationContext.setVariable("collectCar", Lists.newArrayList("比亚迪", "红旗", "吉利"));
// 变量4,POJO对象
evaluationContext.setVariable("user", new User("饱饱"));
// 变量5,匹配正则表达式
evaluationContext.setVariable("number", 142857);
// 4.传入变量上下文,通过表达式对象取得结果
String result = expression.getValue(evaluationContext, String.class);
System.out.println(result);
}
用法二 修改变量值
@Test
public void spelSetValueTest() {
// 1. 设置变量
Car car = new Car("比亚迪");
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("car", car);
// 2. 创建解析器
ExpressionParser expressionParser = new SpelExpressionParser();
// 3. 执行表达式,取得表达式结果
String carExpressionStr = "#car.name";
Expression carExpression = expressionParser.parseExpression(carExpressionStr);
// 4. 修改变量值
String nowValue = carExpression.getValue(standardEvaluationContext, String.class);
carExpression.setValue(standardEvaluationContext, nowValue + "-海豹");
System.out.println(car.getName());
}
用法三 调用Component的方法
@Test
public void beanFactoryResolverTest() {
// 0. 此处用DefaultListableBeanFactory做测试,系统运行时可传入ApplicationContext
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
User user = new User("饱饱");
beanFactory.registerSingleton("user", user);
System.out.println(beanFactory.getBean("user"));
// 1. 设置bean解析器
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setBeanResolver(new BeanFactoryResolver(beanFactory));
// 2. 设置spel解析器
ExpressionParser expressionParser = new SpelExpressionParser();
// 3. spel解析器执行表达式取得结果
String dreamExpressionStr = "@user.dream()";
String result = expressionParser.parseExpression(dreamExpressionStr).getValue(standardEvaluationContext, String.class);
System.out.println(result);
}
还有其它运算, 如算术运算、逻辑运算、比较运算、类实例化、instanceof、内联List、内联数组、集合投影、集合选择......, 不一一列举
网友评论