0x00 SPEL简介
SPEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。从Spring 3开始引入了Spring表达式语言,它能够以一种强大而简洁的方式将值装配到Bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。使用SPEL你可以实现超乎想象的装配效果,这是其他装配技术很难做到的。
0x01 SPEL使用
SPEL的使用可以分为两种方式,第一种是在注解中进行使用,另一种是通过SPEL组件提供的接口来进行解析。
首先是通过注解来使用
@Value("#{表达式}")
public String arg;
@Value("hello")
private String word;
@Value("http://www.baidu.com")
private Resource url;
接下来是通过调用接口的使用情况
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression expres = parser.parseExpression("3*3");
String message = expres.getValue(String.class);
System.out.println(message);
这段代码是执行一段简单的SPEL表达式“3*3”,最终执行结果如下所示
SPEL表达式还能执行一些更复杂的命令,例如对一个对象进行操作,代码如下所示,首先是一个pojo类
public class User {
public String userName;
public User() {
}
public User(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String sayHi(String name){
return name+" say: Hi";
}
public static String sayBye(String userName){
return userName+"say: Bye";
}
}
然后是通过Spel表达式操作user对象的属性
User user = new User();
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(user);
context.setVariable("newUserName","Jone");
parser.parseExpression("userName=#newUserName").getValue(context);
System.out.println(user.getUserName());
parser.parseExpression("userName='Tom'").getValue(context);
System.out.println(user.getUserName());
context.setVariable("user",user);
String name = (String)parser.parseExpression("#user.userName").getValue(context);
可以操作对象的属性SPEL同样也可以操作对象的方法,例如我们的pojo类User中就有一个成员方法sayHi,和一个静态方法sayBye,我们使用SPEL表达式来分别调用一下
首先是调用成员方法,也就是动态方法
User user = new User();
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(user);
context.setVariable("user",user);
String result = (String) parser.parseExpression("#user.sayHi('jack')").getValue(context);
System.out.println(result);
运行结果如下
然后是调用静态方法,代码如下所示
ExpressionParser parser = new SpelExpressionParser();
String result = parser.parseExpression("T(com.Spel.pojo.User).sayBye('Jack')").getValue(String.class);
System.out.println(result);
除了以上两种方可以调用静态方法以外还有一种方法
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
Method sayBye = User.class.getMethod("sayBye"