Spring SpEL 中的EvaluationContext 及Root

来源:互联网 发布:centos版本查看命令 编辑:程序博客网 时间:2024/06/06 10:38

这里写图片描述

理解:
EvaluationContext可以理解为parser 在这个环境里执行parseExpression解析操作,比如说我们现在往ctx(一个EvaluationContext )中放入一个 对象list (注:假设list里面已经有数据,即list[0]=true).

ctx.setVariable("list" , list);//可以理解为往ctx域 里放了一个list变量

接下来要想获取或设置list的值都要在ctx范围内才能找到:
(!!!!! #号用来取通过setVariable()放进去的变量)

parser.parseExpression("#list[0]").getValue(ctx);//在ctx这个环境里解析出list[0]的值parser.parseExpression("#list[0]").setValue(ctx , "false");//在ctx这个环境中奖 list[0]设为false

假如我们又往ctx中放入一个person对象(假设person已经实例化并且person.name的值是fc)

ctx.setVariable("p", person);

那么取其中name属性要像下面这样:

parser.parseExpression("#p.name").getValue(ctx);//结果是 fc 

但是若是我们将ctx的root设为person 取name的时候就可以省略root对象这个前缀了

//StandardEvaluationContext是EvaluationContext的子类 提供了setRootObject方法((StandardEvaluationContext)ctx2).setRootObject(person);parser.parseExpression("name").getValue(ctx2); //访问rootobject即person的属性那么   结果:fc

当然其实也可以完全不用ctx直接用下面的方式活得name:

parser.parseExpression("name").getValue(person);//在person上解析name属性 即可得到 fc 

下面贴出我实验时的代码:

//创建一个ExpressionParser对象,用于解析表达式        ExpressionParser parser = new SpelExpressionParser();        //最简单的字符串表达式        Expression exp = parser.parseExpression("'HelloWorld'");        System.out.println("'HelloWorld'的结果: " + exp.getValue());        //调用方法的表达式        exp = parser.parseExpression("'HelloWorld'.concat('!')");        System.out.println("'HelloWorld'.concat('!')的结果: "            + exp.getValue());        //调用对象的getter方法        exp = parser.parseExpression("'HelloWorld'.bytes");        System.out.println("'HelloWorld'.bytes的结果: "            + exp.getValue());        //访问对象的属性(d相当于HelloWorld.getBytes().length)        exp = parser.parseExpression("'HelloWorld'.bytes.length");        System.out.println("'HelloWorld'.bytes.length的结果:"            + exp.getValue());        //使用构造器来创建对象        exp = parser.parseExpression("new String('helloworld')"            + ".toUpperCase()");        System.out.println("new String('helloworld')"            + ".toUpperCase()的结果是: "            + exp.getValue(String.class));        Person person = new Person(6 , "孙悟空12", new Date());        exp = parser.parseExpression("name");        //以指定对象作为root来计算表达式的值        //相当于调用person.name表达式的值        exp.setValue(person, "fc");        //将person 对象的 name属性设为 fc,没有这一句下面就会输出  孙悟空12        System.out.println("以persn为root,name表达式的值是: "            + exp.getValue(person , String.class));             exp = parser.parseExpression("name=='fc'");        StandardEvaluationContext ctx = new StandardEvaluationContext();        ctx.setRootObject(person);        //以指定Context来计算表达式的值        System.out.println(exp.getValue(ctx , Boolean.class));//true  此时都是 fc        List<Boolean> list = new ArrayList<Boolean>();        list.add(true);        EvaluationContext ctx2 = new StandardEvaluationContext();        //将list设置成EvaluationContext的一个变量        ctx2.setVariable("list" , list);        ctx2.setVariable("p", person);         ((StandardEvaluationContext) ctx2).setRootObject(person);        //修饰list变量的第一个元素的值        System.out.println(parser.parseExpression("#list[0]").getValue(ctx2));//true        parser.parseExpression("#list[0]").setValue(ctx2 , "false");          //修改 现在变为false 下面输出也是false          //list集合的第一个元素被改变        System.out.println("list集合的第一个元素为: "            + list.get(0));        System.out.println(parser.parseExpression("#p.name").getValue(ctx2));//fc        System.out.println(parser.parseExpression("name").getValue(ctx2));//fc
1 0
原创粉丝点击