暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpEL简述

Code视角 2021-11-18
3445
前言

SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言, 支持在运行时查询和操作对象。能极大的减少我们的工作量

支持的功能

    「基本表达式:」 字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;

    「集合表达式:」 内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;

    「类相关表达式:」 类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;

    「模板表达式:」 xml等其它模板里面的 #{} 占位符等。。

使用场景

告警系统阈值配置、xml配置时bean引用、字符串静态方法调用、Spring字符串属性注入时使用表达时调用方法、Spring缓存注解时自定义key等

使用

    「加入依赖」

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-expression</artifactId>
 <version>${spring.version}</version>
</dependency>

    「DEMO」

        「调用方法」

// org.springframework.expression

Expression exp = parser.parseExpression("'Hello World'"); 
String message = (String) exp.getValue();

// message现在是'Hello World'

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')"); 
String message = (String) exp.getValue();
// message现在是“Hello World!”

// 转换byte数组
Expression exp = parser.parseExpression("'Hello World'.bytes"); 
byte[] bytes = (byte[]) exp.getValue();

// 长度
Expression exp = parser.parseExpression("'Hello World'.bytes.length"); 
int length = (Integer) exp.getValue();

// 大小写
Expression exp = parser.parseExpression("new String('hello world').toUpperCase()"); 
String message = exp.getValue(String.class);

// 部分代码样例

        「XML中使用」

<!-- 给属性赋值, 调用静态贩方法-->
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
</bean>

<!-- 访问Spring org.springframework.core.env.Environment 中的上下文属性,下文‘systemProperties’也是拿的Spring容器中的属性 -->
<bean id="taxCalculator" class="org.spring.samples.TaxCalculator">
    <property name="defaultLocale" value="#{ systemProperties['user.region'] }"/>
</bean>


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

<!-- 引用spring中的bean的属性 -->
<bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
</bean>


        「注解中使用」

public class FieldValueTestBean {

    @Value("#{ systemProperties['user.region'] }")
    private String defaultLocale;

    //  @Value("#{ systemProperties['user.region'] }") //在方法上设置效果也是一样
    public void setDefaultLocale(String defaultLocale) {
        this.defaultLocale = defaultLocale;
    }

    public String getDefaultLocale() {
        return this.defaultLocale;
    }
}

public class SimpleMovieLister {

    private MovieFinder movieFinder;
    private String defaultLocale;

    @Autowired
    public void configure(MovieFinder movieFinder,
            @Value("#{ systemProperties['user.region'] }")
 String defaultLocale) 
{
        this.movieFinder = movieFinder;
        this.defaultLocale = defaultLocale;
    }
}
// SpEL也支持各种逻辑运算符

相关语法参考

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions-language-ref

这里是官网,希望你也看着官网学习,一起进步。笔者就偷个懒。如果喜欢、或者需要探讨欢迎关注公众号:Java菜鸟笔记


文章转载自Code视角,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论