Spring实战之SpEl语法实例详解

本文实例讲述了Spring实战之SpEl语法。分享给大家供大家参考,具体如下:

一 Bean

package org.crazyit.app.domain;
import java.util.Date;
public class Person
{
   private Integer id;
   private String name;
   private int height;
   public Person()
   {
   }
   // 初始化全部成员变量的构造器
   public Person(Integer id , String name , int height)
   {
      this.id = id;
      this.name = name;
      this.height = height;
   }
   // id的setter和getter方法
   public void setId(Integer id)
   {
      this.id = id;
   }
   public Integer getId()
   {
      return this.id;
   }
   // name的setter和getter方法
   public void setName(String name)
   {
      this.name = name;
   }
   public String getName()
   {
      return this.name;
   }
   // height的setter和getter方法
   public void setHeight(int height)
   {
      this.height = height;
   }
   public int getHeight()
   {
      return this.height;
   }
}

二 测试类

package lee;
import org.springframework.expression.*;
import org.springframework.expression.spel.standard.*;
import org.springframework.expression.spel.support.*;
import org.springframework.expression.common.TemplateParserContext;
import java.util.*;
import org.crazyit.app.domain.*;
public class SpELTest
{
  public static void main(String[] args)
  {
    // 创建一个ExpressionParser对象,用于解析表达式
    ExpressionParser parser = new SpelExpressionParser();
    // 使用直接量表达式
    Expression exp = parser.parseExpression("'Hello World'");
    System.out.println(exp.getValue(String.class));
    exp = parser.parseExpression("0.23");
    System.out.println(exp.getValue(Double.class));
    System.out.println("---------------------------------------------");
    //------------使用SpEL创建数组-----------
    // 创建一个数组
    exp = parser.parseExpression(
      "new String[]{'java' , 'Struts' , 'Spring'}");
    System.out.println(exp.getValue());
    // 创建二维数组
    exp = parser.parseExpression(
      "new int[2][4]");
    System.out.println(exp.getValue());
    System.out.println("---------------------------------------------");
    //------------使用SpEL创建List集合-----------
    exp = parser.parseExpression(
      "{'java' , 'Struts' , 'Spring'}");
    System.out.println(exp.getValue());
    // 创建“二维”List集合
    exp = parser.parseExpression(
      "{{'疯狂Java讲义' , '疯狂Android讲义'}, {'左传' , '战国策'}}");
    System.out.println(exp.getValue());
    System.out.println("---------------------------------------------");
    //------------使用SpEL访问List集合、Map集合的元素-----------
    List<String> list = new ArrayList<String>();
    list.add("Java");
    list.add("Spring");
    Map<String, Double> map =
      new HashMap<String, Double>();
    map.put("Java" , 80.0);
    map.put("Spring" , 89.0);
    // 创建一个EvaluationContext对象,作为SpEL解析变量的上下文
    EvaluationContext ctx = new StandardEvaluationContext();
    // 设置两个变量
    ctx.setVariable("mylist" , list);
    ctx.setVariable("mymap" , map);
    // 访问List集合的第二个元素
    System.out.println(parser
      .parseExpression("#mylist[1]").getValue(ctx));
    // 访问Map集合的指定元素
    System.out.println(parser
      .parseExpression("#mymap['Java']").getValue(ctx));
    System.out.println("---------------------------------------------");
    //------------使用SpEL调用方法-----------
    // 调用String对象的substring()方法
    System.out.println(parser
      .parseExpression("'HelloWorld'.substring(2, 5)")
      .getValue());
    list = new ArrayList<String>();
    list.add("java");
    list.add("struts");
    list.add("spring");
    list.add("hibernate");
    // 创建一个EvaluationContext对象,作为SpEL解析变量的上下文
    ctx = new StandardEvaluationContext();
    // 设置一个变量
    ctx.setVariable("mylist" , list);
    // 调用指定变量所代表的对象的subList()方法
    System.out.println(parser
      .parseExpression("#mylist.subList(1, 3)").getValue(ctx));
    System.out.println("---------------------------------------------");
    //------------在SpEL中使用运算符-----------
    list = new ArrayList<String>();
    list.add("java");
    list.add("struts");
    list.add("spring");
    list.add("hibernate");
    // 创建一个EvaluationContext对象,作为SpEL解析变量的上下文
    ctx = new StandardEvaluationContext();
    // 设置一个变量
    ctx.setVariable("mylist" , list);
    // 对集合的第一个元素进行赋值
    parser.parseExpression("#mylist[0]='疯狂Java讲义'")
      .getValue(ctx);
    // 下面将输出 疯狂Java讲义
    System.out.println(list.get(0));
    // 使用三目运算符
    System.out.println(parser.parseExpression("#mylist.size()>3?"
      + "'myList长度大于3':'myList长度不大于3'")
      .getValue(ctx));
    System.out.println("---------------------------------------------");
    //------------在SpEL中使用类型运算符-----------
    //调用Math的静态方法
    System.out.println(parser.parseExpression(
      "T(java.lang.Math).random()").getValue());
    //调用Math的静态方法
    System.out.println(parser.parseExpression(
      "T(System).getProperty('os.name')").getValue());
    System.out.println("---------------------------------------------");
    //------------在SpEL中调用构造器-----------
    // 创建对象
    System.out.println(parser.parseExpression(
      "new String('HelloWorld').substring(2, 4)")
      .getValue());
    // 创建对象
    System.out.println(parser.parseExpression(
      "new javax.swing.JFrame('测试')"
      + ".setVisible('true')").getValue());
    System.out.println("---------------------------------------------");
    //------------在SpEL中使用安全导航操作-----------
    // 使用安全操作,将输出null
    System.out.println("----" + parser.parseExpression(
      "#foo?.bar").getValue());
    // 不使用安全操作,将引发NullPointerException
//    System.out.println(parser.parseExpression(
//      "#foo.bar").getValue());
    System.out.println("---------------------------------------------");
    //------------在SpEL中对集合进行选择-----------
    list = new ArrayList<String>();
    list.add("疯狂Java讲义");
    list.add("疯狂Ajax讲义");
    list.add("疯狂iOS讲义");
    list.add("经典Java EE企业应用实战");
    // 创建一个EvaluationContext对象,作为SpEL解析变量的上下文
    ctx = new StandardEvaluationContext();
    ctx.setVariable("mylist" , list);
    // 判断集合元素length()方法的长度大于7,“疯狂iOS讲义”被剔除
    Expression expr = parser.parseExpression
      ("#mylist.?[length()>7]");
    System.out.println(expr.getValue(ctx));
    map = new HashMap<String ,Double>();
    map.put("Java" , 89.0);
    map.put("Spring" , 82.0);
    map.put("英语" , 75.0);
    ctx.setVariable("mymap" , map);
    // 判断Map集合的value值大于80,只保留前面2个Entry
    expr = parser.parseExpression
      ("#mymap.?[value>80]");
    System.out.println(expr.getValue(ctx));
    System.out.println("---------------------------------------------");
    //------------在SpEL中对集合进行投影-----------
    list = new ArrayList<String>();
    list.add("疯狂Java讲义");
    list.add("疯狂Ajax讲义");
    list.add("疯狂iOS讲义");
    list.add("经典Java EE企业应用实战");
    // 创建一个EvaluationContext对象,作为SpEL解析变量的上下文
    ctx = new StandardEvaluationContext();
    ctx.setVariable("mylist" , list);
    // 得到的新集合的元素是原集合的每个元素length()方法返回值
    expr = parser.parseExpression
      ("#mylist.![length()]");
    System.out.println(expr.getValue(ctx));
    List<Person> list2 = new ArrayList<Person>();
    list2.add(new Person(1, "孙悟空" , 162));
    list2.add(new Person(2, "猪八戒" , 182));
    list2.add(new Person(3, "牛魔王" , 195));
    ctx.setVariable("mylist2" , list2);
    // 得到的新集合的元素是原集合的每个元素name属性值
    expr = parser.parseExpression
      ("#mylist2.![name]");
    System.out.println(expr.getValue(ctx));
    System.out.println("---------------------------------------------");
    //------------在SpEL中使用表达式模板-----------
    Person p1 = new Person(1, "孙悟空" , 162);
    Person p2 = new Person(2, "猪八戒" , 182);
    expr = parser.parseExpression(
      "我的名字是#{name},身高是#{height}"
      , new TemplateParserContext());
    // 将使用p1对象name、height填充上面表达式模板中的#{}
    System.out.println(expr.getValue(p1));
    // 将使用p2对象name、height填充上面表达式模板中的#{}
    System.out.println(expr.getValue(p2));
  }
}

三 测试结果

Hello World
0.23
---------------------------------------------
[Ljava.lang.String;@2c13da15
[[I@77556fd
---------------------------------------------
[java, Struts, Spring]
[[疯狂Java讲义, 疯狂Android讲义], [左传, 战国策]]
---------------------------------------------
Spring
80.0
---------------------------------------------
llo
[struts, spring]
---------------------------------------------
疯狂Java讲义
myList长度大于3
---------------------------------------------
0.5577767377702313
Windows 10
---------------------------------------------
ll
null
---------------------------------------------
----null
---------------------------------------------
[疯狂Java讲义, 疯狂Ajax讲义, 经典Java EE企业应用实战]
{Java=89.0, Spring=82.0}
---------------------------------------------
[8, 8, 7, 15]
[孙悟空, 猪八戒, 牛魔王]
---------------------------------------------
我的名字是孙悟空,身高是162
我的名字是猪八戒,身高是182

更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Spring实战之Bean销毁之前的行为操作示例

    本文实例讲述了Spring实战之Bean销毁之前的行为操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:

  • Java类获取Spring中bean的5种方式

    获取Spring中的bean有很多种方式,再次总结一下: 第一种:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring. 第二种:通过Spring提供

  • Spring组件开发模式支持SPEL表达式

    本文是一个 Spring 扩展支持 SPEL 的简单模式,方便第三方通过 Spring 提供额外功能. 简化版方式 这种方式可以在任何能获取ApplicationContext 的地方使用.还可以提取一个方法处理动态 SPEL 表达式. import org.springframework.aop.support.AopUtils; import org.springframework.beans.BeansException; import org.springframework.beans.

  • Spring实战之获取其他Bean的属性值操作示例

    本文实例讲述了Spring实战之获取其他Bean的属性值操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xml

  • Spring spel表达式使用方法示例

    spring in action第三版读书笔记 spring3.0引入了spring expression language(spel)语言,通过spel我们可以实现 1.通过bean的id对bean进行引用 2.调用方法以及引用对象中的属性 3.计算表达式的值 4.正则表达式的匹配 5.集合的操作 spel最终的目标是得到表达式计算之后的值,这些表达式可能是列举的一些值,引用对象的某些属性,或者是类中的某些常量,复杂的spel表达式通常都是由一些简单的元素构成的.最简单的仅仅是得到一些给出元素

  • Spring实战之Bean定义中的SpEL表达式语言支持操作示例

    本文实例讲述了Spring实战之Bean定义中的SpEL表达式语言支持操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <!-- 指定Spring配置文件的根元素和Schema 导入p:命名空间和util:命名空间的元素 --> <beans xmlns="http://www.springframework.org/schema/beans"

  • Spring实战之协调作用域不同步的Bean操作示例

    本文实例讲述了Spring实战之协调作用域不同步的Bean操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xs

  • Spring Bean初始化及销毁多种实现方式

    这篇文章主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.前言 日常开发过程有时需要在应用启动之后加载某些资源,或者在应用关闭之前释放资源.Spring 框架提供相关功能,围绕 Spring Bean 生命周期,可以在 Bean 创建过程初始化资源,以及销毁 Bean 过程释放资源.Spring 提供多种不同的方式初始化/销毁 Bean,如果同时使用这几种方式,Spring 如何处理这几

  • Spring的自动装配Bean的三种方式

    spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会自动建立javabean之间的关联关系. 如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="ht

  • 详解Spring 中如何控制2个bean中的初始化顺序

    开发过程中有这样一个场景,2个 bean 初始化逻辑中有依赖关系,需要控制二者的初始化顺序.实现方式可以有多种,本文结合目前对 Spring 的理解,尝试列出几种思路. 场景 假设A,B两个 bean 都需要在初始化的时候从本地磁盘读取文件,其中B加载的文件,依赖A中加载的全局配置文件中配置的路径,所以需要A先于B初始化,此外A中的配置改变后也需要触发B的重新加载逻辑,所以A,B需要注入彼此. 对于下面的模型,问题简化为:我们需要initA()先于initB()得到执行. @Service pu

随机推荐