SpEL 的使用

SpEL 的使用

SpEL的全称为 Spring Expression Language,具有再运行时构建复杂表达式、存取对象图属性、对象方法调用等功能

下面是一个简单样例

java 复制代码
public class SpelTest {  
	@Test  
	public void test1() {  
	    ExpressionParser parser = new SpelExpressionParser();  
	    EvaluationContext context = new StandardEvaluationContext();  
	    Expression expression = parser.parseExpression("'Hello' + ' world' + '!'");  
	    System.out.println(expression.getValue(context));  
	}
}

输出:

cmd 复制代码
Hello world!

可以看到,再这个例子中,表达式为'Hello' + ' world' + '!',可以看作是'Hello'' world''!'三个字符串的拼接,解析后返回Hello world!

SpEL也支持数字运算:

java 复制代码
@Test  
public void test2() {  
  ExpressionParser parser = new SpelExpressionParser();  
    EvaluationContext context = new StandardEvaluationContext();  
    Expression expression = parser.parseExpression("100 + 10");  
    System.out.println(expression.getValue(context));  
    expression = parser.parseExpression("100 - 10");  
    System.out.println(expression.getValue(context));  
    expression = parser.parseExpression("100 * 10");  
    System.out.println(expression.getValue(context));  
    expression = parser.parseExpression("100 / 10");  
    System.out.println(expression.getValue(context));  
    expression = parser.parseExpression("100 > 10");  
    System.out.println(expression.getValue(context));  
    expression = parser.parseExpression("100 > 10 ? 'A' : 'B'");  
    System.out.println(expression.getValue(context));  
}

输出:

cmd 复制代码
110
90
1000
10
true
A

此外,SpEL也可以解析方法调用,能够获取调用指定类的指定方法和属性:

java 复制代码
@Test  
public void test3() {  
  UserInfo userInfo = new UserInfo();  
    userInfo.setUserName("AAA");  
    ExpressionParser parser = new SpelExpressionParser();  
    StandardEvaluationContext context = new StandardEvaluationContext(userInfo);  
    String getUserName = "getUserName";  
    Expression expression = parser.parseExpression(getUserName);  
    System.out.println(expression.getValue(context));  
}

输出:

cmd 复制代码
AAA

也可以设置参数:

java 复制代码
@Test  
public void test4() {  
  UserInfo userInfo = new UserInfo();  
    userInfo.setUserName("BBB");  
    ExpressionParser parser = new SpelExpressionParser();  
    String setUserName = "setUserName(#userName)";  
    StandardEvaluationContext context = new StandardEvaluationContext(userInfo);  
    context.setVariable("userName", "AAA");  
    Expression expression = parser.parseExpression(setUserName);  
    System.out.println(userInfo.getUserName());  
}

使用案例:

在公司实习的时候,公司组件封装了@DistributedLock注解来管理分布式锁,而锁key则是根据加锁对象类型的不同而有不同取值,但是由于注解的属性值只能是常量,不能直接等于成成员变量的值,这时候使用SpEL可以解决这问题

java 复制代码
@DistributedLock(lockKey = "getType()")  
@Override  
public void doSomething(UserInfo userInfo) {  
  // ...
}

在这个例子中,他会在代理解析过程中调用被代理方法的第一个参数的指定方法,即lockKey的值,也就是userInfo.getType()来设置分布式锁的key,这样就能对加锁对象进行动态的调整

个人想法:

之前有个需求里需要根据用户的账号类型对账号的值执行不同的校验逻辑,当时想试着使用自定义校验注解实现,但是由于注解中的属性赋值不能是变量,所以无法动态获取实体类的状态类型,现在学了SpEL,可以使用SpEL的方式来实现该功能了

相关推荐
*小海豚*几秒前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
撩得Android一次心动16 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一20 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.24 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
一 乐27 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii28 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
80530单词突击赢29 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
vx1_Biye_Design39 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design40 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hay_lee1 小时前
Spring AI实现对话聊天-流式输出
java·人工智能·ollama·spring ai