专栏首页cwl_JavaSpring中的SpEL表达式概述

Spring中的SpEL表达式概述

1.SpEL概述

Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言, 能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。 
  • Spring表达式支持功能
    • 字符表达式
    • 布尔值和关系操作符
    • 正则表达式
    • 类表达式
    • 访问properties,arrays,lists,maps
    • 方法调用
    • 赋值
    • 调用构造器
    • 三元操作符
    • 变量
    • 用户自定义函数
    • 集合投影
    • 集合选择
    • 模板表达式
  • 使用Spring Expression接口进行求值
    • 使用ExpressionParser接口表示解析器,提供SpelExpressionParser默认实现;
    • 使用ExpressionParser的parseExpression来解析的表达式为Expression对象;
    • 构造上下文,准备比如变量定义等表达式需要的数据,此步骤可选,要视乎表达式是否有需要;
    • 通过Expression的getValue方法获取表达式的值

代码示例

ExpressionParser parser= new SpelExpressionParser();
Expression exp=parser.parseExpression("'HelloWorld'");
String message=(String)exp.getValue();
  • 创建Bean管理
    • 基于XML

    <bean id="numberGuess" class="org.spring.samples.NumberGuess"> <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> <!-- other properties --> </bean>

    • 基于注解

    public static class FieldValueTestBean @Value("#{ systemProperties['user.region'] }") private String defaultLocale; public void setDefaultLocale(String defaultLocale) { this.defaultLocale = defaultLocale; } public String getDefaultLocale() { return this.defaultLocale; } }

    • 自动装配构造器

    public class SimpleMovieLister{ private MovieFindermovieFinder; private StringdefaultLocale; @Autowired public void configure(MovieFindermovieFinder,@Value("#{systemProperties['user.region']}"}StringdefaultLocale){ this.movieFinder=movieFinder; this.defaultLocale=defaultLocale; } }

  • SEL示例参考

DEMO1

ExpressionParser parser = new SpelExpressionParser();

// evals to "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();

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

// evals to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();

boolean trueValue = (Boolean) parser.parseExpression("true").getValue();

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

DEMO2

class TestUser {
    private String name;
    public Date birthday;
    Integer age;

    TestUser(Integer age, Date birthday, String name) {
        this.age = age;
        this.birthday = birthday;
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
   static public void main(String[] args) throws Exception {
       try {
           TestUser testUser = new TestUser(10, new Date(), "aaa");
           ExpressionParser parser = new SpelExpressionParser();
           String name = (String) parser.parseExpression("name").getValue(context);
           System.out.println(name);
	} catch (Exception e) {
           e.printStackTrace();
	}
   }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速学习-Mybatis框架入门

    通过前面的学习,我们已经能够使用所学的基础知识构建自定义的 Mybatis 框架了。这个过程是基本功的考验,我们已经强大了不少,但现实是残酷的,我们所定义的 M...

    cwl_java
  • 快速学习-MyBatis入门

    cwl_java
  • 设计模式-门面模式

    cwl_java
  • 对象与类(Java学习-2)

    我个人的看法是,C语言是面向过程的,更多的是算法+数据结构,一个程序成百上千的“过程”,以至于特别的繁琐;某天某人推出了一个“面向对象的架构”,先在关系数据库验...

    营琪
  • 聊聊debezium的SimpleSourceConnector

    debezium-v1.1.1.Final/debezium-embedded/src/main/java/io/debezium/connector/simp...

    codecraft
  • 原创 | 一篇解决Springboot 整合 Elasticsearch

    结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务。

    润森
  • RabbitMQ使用多路由,多队列来破除流控

    流控机制是我们在使用RabbitMQ最头疼的问题,一旦并发激增时,消费者消费队列消息就像滴水一样慢。

    算法之名
  • Java 函数式编程和 lambda 表达式

    函数式编程更多时候是一种编程的思维方式,是种方法论。函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。说白了,...

    芋道源码
  • 聊聊debezium的SimpleSourceConnector

    debezium-v1.1.1.Final/debezium-embedded/src/main/java/io/debezium/connector/simp...

    codecraft
  • FastJson的学习之JSON互相转Map集合,List集合,JavaBean

    秋白

扫码关注云+社区

领取腾讯云代金券