iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >spring之SpEL表达式详解
  • 465
分享到

spring之SpEL表达式详解

2024-04-02 19:04:59 465人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.什么是SpEL表达式2.SpEL表达式语言入门程序(1)xml配置的方式(2)采用注解的方式3.分析器4.使用SpEL表达式调用方法(1)使用SpEL调用普通方法(2)使用S

1.什么是SpEL表达式

SpEL表达式语言是一种表达式语言,是一种可以与一个基于spring的应用程序中的运行时对象交互的东西。有点类似于ognl表达式。总得来说SpEL表达式是一种简化开发的表达式,通过使用表达式来简化开发,减少一些逻辑、配置的编写。

2.SpEL表达式语言入门程序

(1)xml配置的方式

配置环境:pom.xml

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.0.5.RELEASE</version>
		</dependency>
		<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>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.0.5.RELEASE</version>
		</dependency>
</dependencies>

applicationContext.xml文件:

<bean id="MyMessage" class="cn.spy.spel.injection.MyMessage">
        <property name="message" value="#{systemProperties['user.language']}"></property>
</bean>

MyMessage.java文件: 

public class MyMessage {
 
	private String message;
 
	public String getMessage() {
		return message;
	}
 
	public void setMessage(String message) {
		this.message = message;
	}
	
}

测试程序:

public class Test {
	public static void main(String[] args) {
		ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
		MyMessage myMessage =context.getBean(MyMessage.class);
		System.out.println(myMessage.getMessage());
	}
}

结果:

解释:这里使用了表达式#{systemProperties['user.language']}来设置值,用来检索用户语言系统的属性。

(2)采用注解的方式

applicationContext.xml文件:

<context:component-scan base-package="cn.spy.spel"></context:component-scan>

MyMessage2.java文件:

@Component
public class MyMessage2 {
	
	@Value("#{systemProperties['user.language']}")
	private String message;
 
	public String getMessage() {
		return message;
	}
}

解释:这里使用了@Value注解的方式,当实例化MyMessage2这个bean的时候,将使用该注解设置默认值。此处还是使用了之前的SpEL表达式,来设置用户语言系统的属性。(在这里@Value注解既可以在类的字段属性上面,也可以在构造函数和方法上面使用)。

测试:

public static void main(String[] args) {
		ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
		MyMessage2 myMessage =context.getBean(MyMessage2.class);
		System.out.println(myMessage.getMessage());
	}

结果:

3.分析器

SpEL上下文中所定义的每一个表达式都应该首先被解析,然后在被评估。解析的过程采用了ExpressionParser接口的分析器进行处理的。SpelExpressionParser主要负责将字符串表达式解析到已编译的Expression对象中。(创建的分析器实例是线程安全

代码形式:

ExpressionParser parser =new SpelExpressionParser();

注意:

在SpEL表达式中,默认情况下,表达式前缀为 ' # ' ,而后缀为 ' } ' 。如果表达式中没有前缀和后缀,那么表达式字符串就被当作纯文本。

分析器解析Spel中纯文本表达式HelloWorld:

public class HelloWorldTest {
	ExpressionParser parser;
	
	@Before
	public void setup(){
		//初始化创建SpEL表达式解析器
		parser =new SpelExpressionParser();
	}
	
	@Test
	public void test(){
		//使用解析器解析出表达式exp
		Expression exp=parser.parseExpression("'Hello World'");
		//在表达式中获取指定类型的值
		String value =exp.getValue(String.class);
		assertThat(value ,is("Hello World"));
	}
}

junit测试结果:

4.使用SpEL表达式调用方法

(1)使用SpEL调用普通方法

就是SpEL也支持在表达式中采用方法调用的形式

范例:

User.java:

public class User {
	
	private String username;
	private String passWord;
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return "李四";
	}
	public String getPassword() {
		return "lisi123";
	}
	public void printUser(){
		System.out.println("当前用户的用户名:"+username+" ,密码:"+password);
	}
}

applicationContext.xml配置文件:

        <bean id="user1" class="cn.spy.spel.method.User">
			<property name="username" value="张三"></property>
			<property name="password" value="zhangsan123"></property>
		</bean>		
				
		<bean id="user2" class="cn.spy.spel.method.User">
			<property name="username" value="#{user2.getUsername()}"></property>
			<property name="password" value="#{user2.getPassword()}"></property>
		</bean>	

测试:

public class TestMethod {
	public static void main(String[] args) {
		ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
		User user1 =(User) context.getBean("user1");
		user1.printUser();
		User user2 =(User) context.getBean("user2");
		user2.printUser();
	}
}

结果:

(2)使用SpEL调用构造方法

@Test
public void test(){
	ExpressionParser parser =new SpelExpressionParser();
	Expression exp=parser.parseExpression("new Double(3.1415926)");
	Double value =exp.getValue(Double.class);
	assertThat(value ,is(3.1415926));
}

结果:

(3)使用SpEL调用静态方法

@Test
public void test(){
	ExpressionParser parser =new SpelExpressionParser();
	Expression exp=parser.parseExpression("T(java.lang.Math).abs(-1)");
	Integer value =exp.getValue(Integer.class);
	assertThat(value ,is(1));
}

结果:

6.使用SpEL表达式调用变量和函数

(1)#变量的表达式使用

SpEL使用上下文StandardEvaluationContext查找表达式中存在的变量。在表达式中使用变量名称前添加一个标签前缀#,使用已注册的变量。

public class TestSpEL {
	@Test
	public void test(){
		ExpressionParser parser =new SpelExpressionParser();
		StandardEvaluationContext context =new StandardEvaluationContext();
		context.setVariable("message", "Hello World");
		String value =parser.parseExpression("#message").getValue(context, String.class);
		assertThat(value, is("Hello World"));
	}
}

结果:

(2)#root表达式的使用

可以在上下文中设置一个对象评估,可以使用#root访问该对象。

public class TestSpEL {
	@Test
	public void test(){
		ExpressionParser parser =new SpelExpressionParser();
		StandardEvaluationContext context =new StandardEvaluationContext();
		context.setRootObject(new Var());
		Assert.assertTrue(parser.parseExpression("#root").getValue(context) instanceof Var);
	}
}

结果:

(3)访问系统的属性和环境

SpEL预定义变量:systemProperties和systemEnvironment

parser.parseExpression("@systemProperties['java.version']").getValue(context);
parser.parseExpression("@systemProperties[JAVA_HOME]").getValue(context);

7.使用SpEL表达式中的运算符

SpEL提供了多种运算符。

类型

运算符

关系

<,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne

算术

+,- ,* ,/,%,^

逻辑

&&,||,!,and,or,not,between,instanceof

条件

?: (ternary),?: (elvis)

正则表达式

matches

其他类型

?.,?[…],![…],^[…],$[…]

注意:如果解析表达式时,在完全限定的类名中包含一个运算符的文本表示形式,则会产生异常。

正则表达式运算符matches

@Test
	public void test(){
		ExpressionParser parser =new SpelExpressionParser();
		assertThat(parser.parseExpression("35 matches '[0-9]+'").getValue(Boolean.class), is(true));
	}

结果:

逻辑运算符between

@Test
public void test(){
	ExpressionParser parser =new SpelExpressionParser();
	assertThat(parser.parseExpression("3 between {2,5}").getValue(Boolean.class), is(true));
}

结果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: spring之SpEL表达式详解

本文链接: https://www.lsjlt.com/news/139511.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • spring之SpEL表达式详解
    目录1.什么是SpEL表达式2.SpEL表达式语言入门程序(1)xml配置的方式(2)采用注解的方式3.分析器4.使用SpEL表达式调用方法(1)使用SpEL调用普通方法(2)使用S...
    99+
    2024-04-02
  • Spring Cache抽象-使用SpEL表达式解析
    目录Spring Cache抽象-使用SpEL表达式概述SpEl表达式如何让自定义注解支持SpEL表达式使用方法使用案例1.准备2.自定义注解3.定义AOP拦截注解对方法增强进行读写...
    99+
    2024-04-02
  • Spring spel表达式使用方法示例
    spring in action第三版读书笔记spring3.0引入了spring expression language(spel)语言,通过spel我们可以实现通过bean的id对bean进行引用调用方法以及引用对象中的属性计算表达式的...
    99+
    2023-05-31
    spring spel表达式
  • 基于spring @Cacheable 注解的spel表达式解析执行逻辑
    目录直接进入主题 跟随spring的调用链直接看 @Cacheable 注解就可以了接下来看 key获取是在哪里没有任何逻辑就是一个组装了解一下@Cacheable的拦截顺序接下来看...
    99+
    2024-04-02
  • 使用SpringExpressionLanguage(SpEL)全面解析表达式
    目录Spring Expression Language (SpEL)1.环境准备2.SpEL示例应用3.小结Spring表达式语言SpELSpEL:字面量SpEL:引用 Bean、...
    99+
    2024-04-02
  • 基于spring @Cacheable 注解的spel表达式该如何解析执行
    今天就跟大家聊聊有关基于spring @Cacheable 注解的spel表达式该如何解析执行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。日常使用中spring...
    99+
    2023-06-22
  • 使用Springboot自定义注解,支持SPEL表达式
    目录Springboot自定义注解,支持SPEL表达式1.自定义注解2.使用AOP拦截方法,解析注解参数自定义注解结合切面和spel表达式自定义一个注解自定义一个service类,在...
    99+
    2024-04-02
  • JSP之EL表达式基础详解
    一、EL表达式简介 EL表达式全称:Expression Language,即表达式语言 EL表达式作用:代替JSP页面中表达式脚本进行数据的输出 EL表达...
    99+
    2024-04-02
  • JavaLambda表达式详解
    Java Lambda表达式是JDK8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数...
    99+
    2023-02-18
    Java Lambda表达式详解 Java Lambda表达式创建线程 Java Lambda表达式的语法 Java lambda遍历List集合 Java lambda过滤String
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • SpringDataElasticsearch与SpEL表达式实现ES动态索引
    目录前言实现动态获取索引类索引数据模型ES存储库实现测试注意前言 一般情况下,当我们使用 SpringDataElasticsearch 去操作 ES&...
    99+
    2024-04-02
  • 详解正则表达式之数字验证
    正则表达式可以用来验证字符串是否符合特定的格式要求。在数字验证中,我们可以使用正则表达式来验证字符串是否只包含数字字符。以下是一个基...
    99+
    2023-08-15
    正则表达式
  • 支持SpEL表达式的自定义日志注解@SysLog介绍
    目录序言预期思路过程结果序言 之前封装过一个日志注解,打印方法执行信息,功能较为单一不够灵活,近来兴趣来了,想重构下,使其支持表达式语法,以应对灵活的日志打印需求。 该注解是方法层面...
    99+
    2024-04-02
  • 如何使用Springboot自定义注解并支持SPEL表达式
    这篇文章主要介绍了如何使用Springboot自定义注解并支持SPEL表达式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Springboot自定义注解,支持SPEL表达式举...
    99+
    2023-06-29
  • MariaDB表表达式之公用表表达式(CTE)
    目录前言1.非递归CTE2.递归CTE2.1 语法2.2 递归CTE示例(1)2.2 递归CTE示例(2)2.2 递归CTE示例(3)总结前言 公用表表达式(Common Table...
    99+
    2024-04-02
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • 详解SqlServer 表达式(expression)
    2   具体内容  2.1  使用范围 SQL Server(2008开始) ;Azure SQL数据库;Azure  SQL数据仓库;并行数据仓库 2.2...
    99+
    2024-04-02
  • java lambda表达式详解
    一、Lambda初识 我们知道,在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢?那还可以使用匿名类的方式,如下: public class JavaTest { public ...
    99+
    2023-09-15
    java servlet jvm
  • SpringAOP如何在注解上使用SPEL表达式注入对象
    目录在注解上使用SPEL表达式注入对象场景描述具体案例补充Spring属性注入方式之SPEL表达式在注解上使用SPEL表达式注入对象 场景描述 在平时开发中,我们经常通过定义一些注解...
    99+
    2024-04-02
  • Java中Lambda表达式的进化之路详解
    目录Lambda表达式的进化之路为什么要使用Lambda表达式Lambda表达式的注意点下面是Lambda表达式的实现过程1.最开始使用的是定义外部实现类来完成接口2.开始使用静态内...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作