spring spel表达式_substring sql

spring spel表达式_substring sqlSpEL表达式简介用法1.注解@Value2.XML配置3.Expression表达式语法简介SpringExpressionLanguage(缩写为SpEL)是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。依赖:在这里插入代码片用法SpEL有三种用法,一种是在注解@Value中

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

简介

Spring Expression Language(缩写为SpEL)是一种强大的表达式语言。在Spring 产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于 XML 和基于注解的 Spring 配置还有 bean 定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。
依赖:

		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>

用法

SpEL有三种用法,一种是在注解@Value中;一种是XML配置;最后一种是在代码块中使用Expression。

1. 注解@Value

@Value("#{表达式}")
public String port;

2. XML配置

<bean id="xxx" class="com.lizq.xxx">
    <!-- 同@Value,#{}内是表达式的值,可放在property或constructor-arg内 -->
    <property name="port" value="#{表达式}">
</bean>

3. Expression

import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.PropertyAccessor;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class SpelTest { 

public static void main(String[] args) { 

String skipExpress1 = "${value1==value2}";
String skipExpress2 = "${value1==value2 and value2 == value3}";
Map map = new HashMap<>();
map.put("value1", "val_1");
map.put("value2", "val_1");
map.put("value3", "val_3");
Boolean b1 = SpelTest.expressionParsing(skipExpress1, map);
System.out.println(b1);
Boolean b2 = SpelTest.expressionParsing(skipExpress2, map);
System.out.println(b2);
}
public static Boolean expressionParsing(String skipExpress, Map map) { 

if (skipExpress != null && !"".equals(skipExpress) && map.isEmpty()) { 

return false;
}
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
TemplateParserContext templateParserContext = new TemplateParserContext("${", "}");
PropertyAccessor propertyAccessor = new MapAccessor();
context.setVariables(map);
context.setPropertyAccessors(Arrays.asList(propertyAccessor));
SpelExpression expression = (SpelExpression) parser.parseExpression(skipExpress, templateParserContext);
expression.setEvaluationContext(context);
boolean value = expression.getValue(map, boolean.class);
return value;
}
}

表达式语法

1. 引用Bean、属性和方法(必须是public修饰的)

<!-- 引用其他对象的属性 -->
<property name="userName" value="#{user.name}" />
<!-- 引用其他对象的方法 -->
<property name="userPrint" value="#{user.print()}" />

2. 运算符

算术运算符:+,-,*,/,%,^

<!-- 1000 -->
<property name="num" value="#{10^3}" />
<!-- 2021年1月 -->
<property name="yearMonth" value="#{2021+''+1+''}" />

比较运算符:<,>,==,<=,>=,lt,gt,eq,le,ge
逻辑运算符:and,or,not,&&,||,!
三目运算符:?true:false
正则表达式:matches

<!-- true -->
<property name="emailBool" value="#{email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}'}" />

3. 调用静态方法或静态属性

通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:

<!-- 3.141592653589793 -->
<property name="PI" value="#{T(java.lang.Math).PI}" />

4. 获取容器内的变量

可以使用“#bean_id”来获取。有两个特殊的变量,可以直接使用。

  1. this:使用当前正在计算的上下文
  2. root:引用容器的root对象
String result2 = parser.parseExpression("#root").getValue(ctx, String.class);  
String s = new String("获取容器内的变量");
ctx.setVariable("str",s);
//取id为abc的bean,然后调用其中的substring方法 
parser.parseExpression("#str.substring(0,1)").getValue(ctx, String.class);

5. 方法调用

与Java代码没有什么区别,可见上面的例子
可以自定义方法,如下:

Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class); 
ctx.registerFunction("parseInt1", parseInt);
ctx.setVariable("parseInt2", parseInt);

“registerFunction” 和 “setVariable” 都可以注册自定义函数,但是两个方法的含义不一样,推荐使用 “registerFunction” 方法注册自定义函数。

6. Elvis运算符

是三目运算符的特殊写法,可以避免null报错的情况

// name != null? name : "other" 简写为
name ? : "other"

7. 安全保证

为了避免操作对象本身可能为null,取属性时报错,定义语法
语法: “对象?.变量|方法”

list?.size()

8. 直接使用 java 代码 new/instance of

此方法只能是java.lang 下的类才可以省略包名

Expression exp = parser.parseExpression("new Spring('Hello World')");

9. 集合定义/访问/修改/选择

定义:使用“{表达式,……}”定义List,如“{1,2,3}”

访问:SpEL目前支持所有集合类型和字典类型的元素访问。语法:

“集合[索引]”、“map[key]

修改:可以使用赋值表达式或Expression接口的setValue方法修改;

//赋值语句
int result = parser.parseExpression("#array[1] = 3").getValue(context, int.class);
//serValue方法
parser.parseExpression("#array[2]").setValue(context, 4);

选择:通过一定的规则对及格进行筛选,构造出另一个集合

语法:“(list|map).?[选择表达式]**注意**:选择表达式结果必须是boolean类型,如果true则选择的元素将添加到新集合中,false将不添加到新集合中

选择:根据集合中的元素中通过选择来构造另一个集合,该集合和原集合具有相同数量的元素

语法:“SpEL使用“(list|map).![投影表达式]// 从userlist下筛选出age>18的子集合,再将他们的name字段投为新的list
@Value("#{userlist.?[age>18].![name]}")
private ArrayList<String> usernames;

10. Bean引用

SpEL 支持使用“@”符号来引用 Bean,在引用Bean时需要使用 BeanResolver 接口实现来查找 Bean,Spring 提供 BeanFactoryResolver 实现;

public void testBeanExpression() { 

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.refresh();
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(ctx));
Properties result1 = parser.parseExpression("@systemProperties").getValue(context, Properties.class);
Assert.assertEquals(System.getProperties(), result1);
}

参考文献:
https://www.jianshu.com/p/e0b50053b5d3

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197744.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BigDecimal.setScale方法

    BigDecimal.setScale方法BigDecimal.setScale()方法用于格式化小数点BigDecimal.setScale(1)表示保留一位小数,默认用四舍五入方式 BigDecimal.setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如1.11会变成1.1 BigDecimal.setScale(1,BigDecimal.ROUND_UP)进位处理,1.11变成1.2 BigD…

    2022年10月20日
  • Ruby On Rails 教程学习

    Ruby On Rails 教程学习

  • Python批量修改文件名,文件再多也只要一秒,省时又不闹心

    Python批量修改文件名,文件再多也只要一秒,省时又不闹心前言嗨喽!大家好,这里是魔王对于电脑中的文件夹啊,我们那是新建一个又一个啊,有时候,我们整理资料的时候就会发现,文件夹那是一个杂乱无章,一个一个的去修改太浪费时间,咋今天就来分享一个小技巧:批量修改文件名一、在原有的名字前中后批量加字随意一点,这是我刚刚新建的文件夹和我存放的路径。我们来看看代码,我都详细注释了。importos#导入模块filename=’C:\\Users\\Administrator\\Desktop\\123’#文件地址list_path=os.l

    2022年10月28日
  • acwing-181. 回转游戏(IDA*+迭代加深)[通俗易懂]

    acwing-181. 回转游戏(IDA*+迭代加深)[通俗易懂]如下图所示,有一个 # 形的棋盘,上面有 1,2,3 三种数字各 8 个。给定 8 种操作,分别为图中的 A∼H。这些操作会按照图中字母和箭头所指明的方向,把一条长为 7 的序列循环移动 1 个单位。例如下图最左边的 # 形棋盘执行操作 A 后,会变为下图中间的 # 形棋盘,再执行操作 C 后会变成下图最右边的 # 形棋盘。给定一个初始状态,请使用最少的操作次数,使 # 形棋盘最中间的 8 个格子里的数字相同。输入格式输入包含多组测试用例。每个测试用例占一行,包含 24 个数字,表示将初始棋

  • 七年级小四门知识点_unity animator trigger

    七年级小四门知识点_unity animator triggerUnity小科普老规矩,先介绍一下Unity的科普小知识:Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。也可以简单把Unity理解为一个游戏引擎,可以用来专业制作游戏!Unity小知识点学习Unity中使用代码查询D.

  • 权威外汇交易平台_国内外汇交易平台排行

    权威外汇交易平台_国内外汇交易平台排行Guardian是世界领先的在线金融商品交易平台,在华经营已超过10年,是专业外汇指数交易商。Guardian以优质的客户服务,技术支持以及同业最出色的交易系统使其成为客户理想的选择对象。Guardian服务对象包括金融机构客户,对冲基金,经理人账户和个人客户,多年来以卓越的信誉赢得了客户的满意。Guardian集团是专注于为全球客户提供包括外汇、贵金属、期权、指数、数字货币等交易产品,以及…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号