SpEL表达式
简介
用法
1. 注解@Value
2. XML配置
3. Expression
表达式语法
1. 引用Bean、属性和方法(必须是public修饰的)
2. 运算符
3. 调用静态方法或静态属性
4. 获取容器内的变量
5. 方法调用
6. Elvis运算符
7. 安全保证
8. 直接使用 java 代码 new/instance of
9. 集合定义/访问/修改/选择
10. Bean引用
简介
org.springframework
spring-expression
4.0.5.RELEASE
org.springframework
spring-context
4.0.5.RELEASE
/code>code class='prism'>@Value("#{表达式}")
public String port;/code>code class='prism'>
3. Expression
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.PropertyAccessor;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class SpelTest {
public static void main(String[] args) {
String skipExpress1 = "${value1==value2}";
String skipExpress2 = "${value1==value2 and value2 == value3}";
Map map = new HashMap<>();
map.put("value1", "val_1");
map.put("value2", "val_1");
map.put("value3", "val_3");
Boolean b1 = SpelTest.expressionParsing(skipExpress1, map);
System.out.println(b1);
Boolean b2 = SpelTest.expressionParsing(skipExpress2, map);
System.out.println(b2);
}
public static Boolean expressionParsing(String skipExpress, Map map) {
if (skipExpress != null && !"".equals(skipExpress) && map.isEmpty()) {
return false;
}
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
TemplateParserContext templateParserContext = new TemplateParserContext("${", "}");
PropertyAccessor propertyAccessor = new MapAccessor();
context.setVariables(map);
context.setPropertyAccessors(Arrays.asList(propertyAccessor));
SpelExpression expression = (SpelExpression) parser.parseExpression(skipExpress, templateParserContext);
expression.setEvaluationContext(context);
boolean value = expression.getValue(map, boolean.class);
return value;
}
}
表达式语法
1. 引用Bean、属性和方法(必须是public修饰的)
2. 运算符
算术运算符:+,-,*,/,%,^
比较运算符:<,>,==,<=,>=,lt,gt,eq,le,ge
逻辑运算符:and,or,not,&&,||,!
三目运算符:?true:false
正则表达式:matches
3. 调用静态方法或静态属性
通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:
4. 获取容器内的变量
可以使用“#bean_id”来获取。有两个特殊的变量,可以直接使用。
this:使用当前正在计算的上下文
root:引用容器的root对象
String result2 = parser.parseExpression("#root").getValue(ctx, String.class);
String s = new String("获取容器内的变量");
ctx.setVariable("str",s);
//取id为abc的bean,然后调用其中的substring方法
parser.parseExpression("#str.substring(0,1)").getValue(ctx, String.class);
5. 方法调用
Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
ctx.registerFunction("parseInt1", parseInt);
ctx.setVariable("parseInt2", parseInt);
“registerFunction” 和 “setVariable” 都可以注册自定义函数,但是两个方法的含义不一样,推荐使用 “registerFunction” 方法注册自定义函数。
6. Elvis运算符
是三目运算符的特殊写法,可以避免null报错的情况
// name != null? name : "other" 简写为
name ? : "other"
7. 安全保证
list?.size()
8. 直接使用 java 代码 new/instance of
此方法只能是java.lang 下的类才可以省略包名
Expression exp = parser.parseExpression("new Spring('Hello World')");
9. 集合定义/访问/修改/选择
定义:使用“{表达式,……}”定义List,如“{1,2,3}”
访问:SpEL目前支持所有集合类型和字典类型的素访问。语法:
“集合[索引]”、“map[key]”
修改:可以使用赋值表达式或Expression接口的setValue方法修改;
//赋值语句
int result = parser.parseExpression("#array[1] = 3").getValue(context, int.class);
//serValue方法
parser.parseExpression("#array[2]").setValue(context, 4);
选择:通过一定的规则对及格进行筛选,构造出另一个集合
语法:“(list|map).?[选择表达式]”
注意:选择表达式结果必须是boolean类型,如果true则选择的素将添加到新集合中,false将不添加到新集合中
选择:根据集合中的素中通过选择来构造另一个集合,该集合和原集合具有相同数量的素
语法:“SpEL使用“(list|map).![投影表达式]”
// 从userlist下筛选出age>18的子集合,再将他们的name字段投为新的list
@Value("#{userlist.?[age>18].![name]}")
private ArrayList
usernames;
10. Bean引用
SpEL 支持使用“@”符号来引用 Bean,在引用Bean时需要使用 BeanResolver 接口实现来查找 Bean,Spring 提供 BeanFactoryResolver 实现;
public void testBeanExpression() {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.refresh();
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(ctx));
Properties result1 = parser.parseExpression("@systemProperties").getValue(context, Properties.class);
Assert.assertEquals(System.getProperties(), result1);
} 今天的文章
spring spel表达式_substring sql分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/127782.html