Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”
SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。
支持SpEL的Jar包:“org.springframework.expression-3.0.5.RELEASE.jar”
例子:
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
@Test
public void helloworld(){
// 解析器
ExpressionParser parser = new SpelExpressionParser();
// 解析表达式
Expression expression = parser.parseExpression("('Hello' + ' World').concat(#end)");
// 上下文环境
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("end", "!");
Assert.assertEquals("Hello World!", expression.getValue(context));
}
代码分析:
1)创建解析器:SpEL使用ExpressionParser接口表示解析器,提供SpelExpressionParser默认实现;
2)解析表达式:使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象。
3)构造上下文:准备比如变量定义等等表达式需要的上下文数据。
4)求值:通过Expression接口的getValue方法根据上下文获得表达式值。
bean定义中使用SpEL
例子:
<bean id="address" class="com.spring.beans.SpEL.Address"
p:city="#{'beijing'}" p:street="wudaokou"></bean>
<bean id="car" class="com.spring.beans.SpEL.Car"
p:brand="aodi" p:price="280000" p:typePerimeter="#{T(java.lang.Math).PI * 80}"></bean>
<bean id="person" class="com.spring.beans.SpEL.Person"
p:car="#{car}" p:city="#{address.city}" p:name="lisi"
p:info="#{car.price>300000 ? '金领':'白领'}"></bean>