相对来讲, java是一门静态语言。而我们今天要讲的是一门动态“语言”---SpEL。
动态语言和静态语言的最显著差别在于,举个例子," 'Hello'.toUperCase()"这只是一个普通的字符串,差别在
于能否把它编译和运行起来得到结果。就是说动态语言能把一个字符串解释成程序语句。如果还不是很明白的
话没关系,看下面的SpEL例子。(接下去的我就用例子来做介绍了)
public void testSpEL1() {
//ExpressionParser是Spring3里的一个包,用来动态解释一个字符串。
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(" 'Hello,World' ");
System.out.println((String)exp.getValue());
}
这里'Hello,World' 是一个字符串,解释起来还是一个字符串,所以打印结果是:Hello,World
第二个例子:调用方法
public void testSpEL2() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp=parser.parseExpression(" 'Hello'.concat(' World!')"); //这里调用了字符串String的concat方法
//Expression exp=parser.parseExpression("newString('helloworld').toUpperCase()");
Stringmessage=(String)exp.getValue();
}
第三个例子:调用属性
ExpressionParser parser= new SpelExpressionParser();
Expression exp=parser.parseExpression("'HelloWorld'.bytes"); //得到字符串的byte
//Expression exp=parser.parseExpression("'HelloWorld'.bytes.length"); //得到属性的属性
byte [] bytes=(byte[])exp.getValue();
第四个例子:调用类中的属性(下面开始复杂起来了)
@Resource
public User user; //注入之后,user.getName() 为 xiaoling
public void testSpEL() {
//设“值域”,限定在u这个对象里
EvaluationContext context = new StandardEvaluationContext(user);
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("username"); //==user.getUsername()
System.out.println((String)exp.getValue(context)); //结果:xiaoling
}
或者用更简洁的一个方式:
System.out.println((String)exp.getValue(user));
这样就不用设值域了!呵呵!
第五个例子:给对象中的属性设值
StandardEvaluationContext context = new StandardEvaluationContext(user);
parser.parseExpression("username").setValue(context, "ling");
第六个例子:做判断
Expression exp=parser.parseExpression("name=='xiaoling' ");
boolean result=exp.getValue(context,Boolean.class); //evaluate stotrue
打印出来,结果为true
看到这,可能你还是一头雾水:这算什么新特性啊,哪有什么用处!
用处就在于,SpEL把java变成“动”的了!(纯属我个人观点!!)
接下来,我们把SpEL用到bean.xml中去
先看个例子(例一)
怎么样,可以在xml文件里面赋值了!呵呵!
value里面都用#{}来赋值。至于T(java.lang.Math),它是指某个类,即Math这个类。
看这个例子(例二):systemProperties
systemProperties是预定义好的,里面有很属性可以用,它就相当于java文件中的System.getProperty("user.region"),它能取出当前计算机所在的国家。
例三:引用xml里面的其它bean
SpEL还可以用在annotation中:
例一:用在属性上
public static class FieldValueTestBean{
@Value("#{systemProperties['user.region']}")
private String defaultLocale;
//set和get方法
public void setDefaultLocale(StringdefaultLocale) {
this.defaultLocale=defaultLocale;
}
public StringgetDefaultLocale(){
returnthis.defaultLocale;
}
}
例二:用在方法上
public static class PropertyValueTestBean{
private String defaultLocale;
@Value("#{systemProperties['user.region']}")
public void setDefaultLocale(String defaultLocale){
this.defaultLocale=defaultLocale;
}
public String getDefaultLocale(){
return this.defaultLocale;
}
}
}
例三:Autowired和构造器中
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;
}
//...
}