首页 > 编程语言 > 详细

7 -- Spring的基本用法 -- 12...

时间:2017-01-15 18:12:36      阅读:197      评论:0      收藏:0      [点我收藏+]

  7.12 Spring 3.0 提供的表达式语言(SpEL)

    Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图。支持方法调用和基本字符串模板函数。

    SpEL 可以独立于Spring容器使用------只是当成简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring的Bean配置。

      7.12.1 使用Expression接口进行表达式求值。

        Spring的SpEL 可以单独使用,可以使用SpEL对表达式计算、求值。

        SpEL主要提供了如下三个接口:

          ⊙ ExpressionParser : 该接口的实例负责解析一个SpEL表达式,返回一个Expression对象。

          ⊙ Expression : 该接口的实例代表一个表达式。

          ⊙ EvaluationContext : 代表计算表达式值的上下文。当SpEL表达式中含有变量时,程序将需要使用该API来计算表达式的值。

        Expression实例代表一个表达式,它包含了如下方法用于计算,得到表达式的值。

          ⊙ Object getValue() : 计算表达式的值。

          ⊙ <T> T getValue(Class<T> desiredResultType) : 计算表达式的值,而且尝试将该表达式的值当成desiredResultType类型处理。

          ⊙ Object getValue(EvaluationContext context) : 使用指定的EvaluationContext来计算表达式的值。

          ⊙ <T> T getValue(EvaluationContext context,Class<T> desiredResultType) : 使用指定的EvaluationContext来计算表达式的值,而且尝试将该表达式的值当成desiredResultType类型处理。

          ⊙ Object getValue(Object rootObject) : 以rootObject作为表达式的root对象来计算表达式的值。

          ⊙ <T> T getValue(Object rootObject , Class<T> desiredResultType) : 以rootObject 作为表达式的root对象来计算表达式的值,而且尝试将该表达式的值当场desiredResultType类型来处理。

        Class : SpELTest

package edu.pri.lime._7_12_1.main;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import edu.pri.lime._7_12_1.bean.Person;

public class SpELTest {

    public static void main(String[] args){
//        创建一个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());
//        访问对象的属性(相当于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());
        Person person = new Person(1,"孙悟空", new Date());
        exp = parser.parseExpression("name");
        System.out.println("以Person为root,name表达式的值是 : " + exp.getValue(person, String.class));
        exp = parser.parseExpression("name == ‘孙悟空‘");
        StandardEvaluationContext ctx = new StandardEvaluationContext();
//        将person设为Context的root对象
        ctx.setRootObject(person);
//        以指定Context来计算表达式的值
        System.out.println(exp.getValue(ctx,Boolean.class));
        List<Boolean> list = new ArrayList<Boolean>();
        list.add(true);
        EvaluationContext ctx_ = new StandardEvaluationContext();
//        将list设置成EvaluationContext的一个变量
        ctx_.setVariable("list", list);
//        修改list变量的第一个元素的值
        parser.parseExpression("#list[0]").setValue(ctx_, "false");
//        list集合的第一个元素被改变
        System.out.println("list集合的第一个元素为 : " + parser.parseExpression("#list[0]").getValue(ctx_));
    }
}

        EvaluationContext代表SpEL计算表达式值的“上下文”,这个Context对象可以包含多个对象,但只能有一个root(根)对象。当表达式中包含变量是,SpEL机会根据EvaluationContext中的变量的值对表达式进行计算。

        为了往EvaluationContext里放入对象(SpEL称之为变量),可以调用该对象的如下方法:

          ⊙ setVariable(String name,Object value) : 向EvaluationContext中放入value对象,该对象名为name。为了在SpEL访问EvaluationContext中指定对象,应采用与OGNL类是的格式:#name

        StandardEvaluationContext提供了如下方法来设置root对象。

          ⊙ setRootObject(Object rootObject)

        在SpEL中访问root对象的属性时,可以省略root对象的前缀:foo.bar 访问rootObject的foo属性的bar属性。、

        使用Expression对象计算表达式的值时,可以直接指定root对象:exp.getValue(person,String.class) 以person对象为root对象计算表达式的值。

      7.12.2 Bean定义中的表达式语言支持

        Spring允许在Bean定义中使用SpEL。在XML配置文件和Annotation中都可以使用SpEL。在XML配置文件和Annotation中使用SpEL时,在表达式外面增加#{}包围即可。

啦啦啦

7 -- Spring的基本用法 -- 12...

原文:http://www.cnblogs.com/ClassNotFoundException/p/6287430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!