Java代码 


  1.   相对来讲, java是一门静态语言。而我们今天要讲的是一门动态“语言”---SpEL。  

  2. 动态语言和静态语言的最显著差别在于,举个例子," 'Hello'.toUperCase()"这只是一个普通的字符串,差别在于能否把它编译和运行起来得到结果。就是说动态语言能把一个字符串解释成程序语句。如果还不是很明白的话没关系,看下面的SpEL例子。(接下去的我就用例子来做介绍了)  

  3. public void testSpEL1() {  

  4. //ExpressionParser是Spring3里的一个包,用来动态解释一个字符串。  
  5.   ExpressionParser parser = new SpelExpressionParser();  
  6.   Expression exp = parser.parseExpression(" 'Hello,World' ");  
  7.   System.out.println((String)exp.getValue());  
  8.  }  

  9. 这里'Hello,World' 是一个字符串,解释起来还是一个字符串,所以打印结果是:Hello,World  



  10. 第二个例子:调用方法  

  11. public void testSpEL2() {  

  12. ExpressionParser parser = new SpelExpressionParser();  
  13. Expression exp=parser.parseExpression(" 'Hello'.concat(' World!')");  //这里调用了字符串String的concat方法  

  14. //Expression exp=parser.parseExpression("newString('helloworld').toUpperCase()");  

  15. Stringmessage=(String)exp.getValue();  

  16. }  



  17. 第三个例子:调用属性  

  18. ExpressionParser parser= new SpelExpressionParser();  

  19. Expression exp=parser.parseExpression("'HelloWorld'.bytes");  //得到字符串的byte  

  20. //Expression exp=parser.parseExpression("'HelloWorld'.bytes.length"); //得到属性的属性  
  21. byte [] bytes=(byte[])exp.getValue();  



  22. 第四个例子:调用类中的属性(下面开始复杂起来了)  

  23. @Resource  

  24. public User user;  //注入之后,user.getName() 为 xiaoling  

  25. public void testSpEL() {  

  26.     //设“值域”,限定在u这个对象里  
  27.     EvaluationContext context = new StandardEvaluationContext(user);    
  28.     ExpressionParser parser = new SpelExpressionParser();  
  29.     Expression exp = parser.parseExpression("username"); //==user.getUsername()  
  30.     System.out.println((String)exp.getValue(context));  //结果:xiaoling  

  31.  }  

  32. 或者用更简洁的一个方式 :  
  33.   System.out.println((String)exp.getValue(user));  
  34. 这样就不用设值域了!呵呵!  



  35. 第五个例子:给对象中的属性设值  

  36. StandardEvaluationContext  context = new StandardEvaluationContext(user);  

  37. parser.parseExpression("username").setValue(context, "ling");  



  38. 第六个例子:做判断  

  39. Expression exp=parser.parseExpression("name=='xiaoling' ");  
  40. boolean result=exp.getValue(context,Boolean.class);  //evaluate stotrue  

  41. 打印出来,结果为true  



  42. 看到这,可能你还是一头雾水:这算什么新特性啊,哪有什么用处!  

  43. 用处就在于,SpEL把java变成“动”的了!(纯属我个人观点!!)  



  44. 接下来,我们把SpEL用到bean.xml中去  

  45. 先看个例子(例一)  

  46. <bean id="numberGuess" class="cn.ling.spel.NumberGuess">  
  47.    <property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>  

  48. </bean>  

  49. 怎么样,可以在xml文件里面赋值了!呵呵!  

  50. value里面都用#{}来赋值。至于T(java.lang.Math),它是指某个类,即Math这个类。  



  51. 看这个例子(例二):systemProperties  

  52. <property name="defaultLocale" value="#{systemProperties['user.region']}"/>  

  53. systemProperties是预定义好的,里面有很属性可以用,它就相当于java文件中的System.getProperty("user.region"),它能取出当前计算机所在的国家。  



  54. 例三:引用xml里面的其它bean  

  55. <bean id="numberGuess" class="org.spring.samples.NumberGuess">  
  56. <property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>  
  57. <!--otherproperties-->  
  58. </bean>  
  59. <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">  
  60. <property name="initialShapeSeed" value="#{numberGuess.randomNumber}"/>  
  61. <!--otherproperties-->  
  62. </bean>  



  63. SpEL还可以用在annotation中:  

  64. 例一:用在属性上  

  65. public static class FieldValueTestBean{  
  66.    @Value("#{systemProperties['user.region']}")  
  67.    private String defaultLocale;  

  68.    //set和get方法  
  69.    public void setDefaultLocale(StringdefaultLocale) {  
  70.       this.defaultLocale=defaultLocale;  
  71.    }  

  72.    public StringgetDefaultLocale(){  
  73.       returnthis.defaultLocale;  
  74.    }  
  75. }  

  76. 例二:用在方法上  

  77. public static class PropertyValueTestBean{  
  78.    private String defaultLocale;  
  79.    @Value("#{systemProperties['user.region']}")  
  80.    public void setDefaultLocale(String defaultLocale){  
  81.       this.defaultLocale=defaultLocale;  
  82.    }  
  83.    public String getDefaultLocale(){  
  84.       return this.defaultLocale;  
  85.    }  

  86. }  
  87. }  

  88. 例三:Autowired和构造器中  

  89. public class SimpleMovieLister{  
  90.    private MovieFinder movieFinder;  
  91.    private String defaultLocale;  
  92.    @Autowired  
  93.    public void configure(MovieFinder movieFinder,  
  94.       @Value("#{systemProperties['user.region']}"}String defaultLocale){  
  95.          this.movieFinder=movieFinder;  
  96.          this.defaultLocale=defaultLocale;  
  97.       }  
  98. //...  
  99. }  

  100. 未完待续…………