前言
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




