SPEL语法的大致用法

简介:SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。优点或好处是可以在运行时查询和操作数据,尤其是数组列表型数据,因此可以缩减代码量,优化代码结构。

一、用法

   主要用法大致有以下三种:

  1. 注解@Value中的运用
  2. XML中的配置使用
  3. 代码块中的Expression表达式使用

二、具体用法举例说明

A、@Value的使用

    //#{}内就是表达式的内容
    @Value("#{表达式}")
    public String arg;

B、XML中的配置运用

<bean id="xxx" class="com.java.XXXXX.xx">
    <!-- 同@Value,#{}内是表达式的值,可放在property或constructor-arg内 -->
    <property name="arg" value="#{表达式}">
</bean>

C、代码块中的具体使用

  1. 字面表达式的栗子

        字面表达式支持的数据类型有以下几种:strings, numeric values (int, real, hex), boolean, 和null等。

//表达式对象初始化
ExpressionParser parser = new SpelExpressionParser();

//注意:字符串使用需在加一层单引号包括
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();

// double 类型
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();

//输出:2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();

//布尔类型
boolean trueValue = (Boolean) parser.parseExpression("true").getValue();

//null类型
Object nullValue = parser.parseExpression("null").getValue();

执行输出结果为:

str: Hello World
double: 6.0221415E23
int: 2147483647
bool: true
null: null

    2.spel表达式与集合的配合使用

//初始化
ExpressionParser parser = new SpelExpressionParser();

//输出:Integer列表
List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue();
System.out.println("list: " + numbers);

// List的元素为List
List<List> listlOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue();
System.out.println("List<List> : " + listlOfLists);

输出结果:

list: [1, 2, 3, 4]
List<List> : [[a, b], [x, y]]

   3.与map的配合使用

    ExpressionParser parser = new SpelExpressionParser();
    Map map = (Map) parser.parseExpression("{txt:'Nikola',dob:'10-July-1856'}").getValue();
    System.out.println("map: " + map);
    Map mapOfMaps =
            (Map) parser.parseExpression("{txt:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}")
                    .getValue();
    System.out.println("Map<Map>: " + mapOfMaps);

输出结果:

map: {txt=Nikola, dob=10-July-1856}
Map<Map>: {txt={first=Nikola, last=Tesla}, dob={day=10, month=July, year=1856}}

  4.与数组组合使用

ExpressionParser parser = new SpelExpressionParser();
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue();
System.out.println("array: " + JSON.toJSONString(numbers1));

// Array with initializer
int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue();
System.out.println("array: " + JSON.toJSONString(numbers2));

// Multi dimensional array
int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue();
System.out.println("array: " + JSON.toJSONString(numbers3));


int[] nums = new int[]{1, 3, 5};
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("num", nums);

// 通过下标访问数组中的元素
Integer numVal = parser.parseExpression("#num[1]").getValue(context, Integer.class);
System.out.println("numVal in array: " + numVal);

  输出结果:

array: [0,0,0,0]
array: [1,2,3]
array: [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
numVal in array: 3

 5.表达式的配合使用

     Spel支持一些Java语法中常规的比较判断,算数运算,三元表达式,类型判断,matches正则匹配等基表表达式

ExpressionParser parser = new SpelExpressionParser();
// 运算
System.out.println("1+2= " + parser.parseExpression("1+2").getValue());
// 比较
System.out.println("1<2= " + parser.parseExpression("1<2").getValue());
System.out.println("true ? hello : false > " + parser.parseExpression("3 > 2 ? 'hello': 'false' ").getValue());
// instanceof 判断,请注意静态类,用T进行包装
System.out.println("instance : " + parser.parseExpression("'a' instanceof T(String)").getValue());
//正则表达式
System.out.println("22 是否为两位数字 :" + parser.parseExpression("22 matches '\\d{2}'").getValue());

输出结果:

1+2= 3
1<2= true
true ? hello : false > hello
instance : true
22 是否为两位数字 :true

  6.变量中的相关操作

    操作过程主要有以下两个步骤:

  • context.setVariable("person", person); 向EvaluationContext中塞入成员变量
  • parser.parseExpression(xxx).getValue(context) 解析SpEL表达式,context必须作为传参丢进去哦
//注意事项:方法或字段不能是私有的
ExpressionParser parser = new SpelExpressionParser();
Person person = new Person("一灰灰blog", 18);
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("person", person);

String name = parser.parseExpression("#person.getName()").getValue(context, String.class);
System.out.println("variable name: " + name);

Integer age = parser.parseExpression("#person.age").getValue(context, Integer.class);
System.out.println("variable age: " + age);

输出结果:

1
2
variable name: 一灰灰blog
variable age: 18

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值