`
youanyyou
  • 浏览: 191231 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

spring3.0学习笔记(2)-SpEL表达式1

阅读更多

Java代码 
  1.   相对来讲, java是一门静态语言。而我们今天要讲的是一门动态“语言”---SpEL。  
  2.   
  3. 动态语言和静态语言的最显著差别在于,举个例子," 'Hello'.toUperCase()"这只是一个普通的字符串,差别在于能否把它编译和运行起来得到结果。就是说动态语言能把一个字符串解释成程序语句。如果还不是很明白的话没关系,看下面的SpEL例子。(接下去的我就用例子来做介绍了)  
  4.   
  5. public void testSpEL1() {  
  6.   
  7. //ExpressionParser是Spring3里的一个包,用来动态解释一个字符串。  
  8.   ExpressionParser parser = new SpelExpressionParser();  
  9.   Expression exp = parser.parseExpression(" 'Hello,World' ");  
  10.   System.out.println((String)exp.getValue());  
  11.  }  
  12.   
  13. 这里'Hello,World' 是一个字符串,解释起来还是一个字符串,所以打印结果是:Hello,World  
  14.   
  15.    
  16.   
  17. 第二个例子:调用方法  
  18.   
  19. public void testSpEL2() {  
  20.   
  21. ExpressionParser parser = new SpelExpressionParser();  
  22. Expression exp=parser.parseExpression(" 'Hello'.concat(' World!')");  //这里调用了字符串String的concat方法  
  23.   
  24. //Expression exp=parser.parseExpression("newString('helloworld').toUpperCase()");  
  25.   
  26. Stringmessage=(String)exp.getValue();  
  27.   
  28. }  
  29.   
  30.    
  31.   
  32. 第三个例子:调用属性  
  33.   
  34. ExpressionParser parser= new SpelExpressionParser();  
  35.   
  36. Expression exp=parser.parseExpression("'HelloWorld'.bytes");  //得到字符串的byte  
  37.   
  38. //Expression exp=parser.parseExpression("'HelloWorld'.bytes.length"); //得到属性的属性  
  39. byte [] bytes=(byte[])exp.getValue();  
  40.   
  41.    
  42.   
  43. 第四个例子:调用类中的属性(下面开始复杂起来了)  
  44.   
  45. @Resource  
  46.   
  47. public User user;  //注入之后,user.getName() 为 xiaoling  
  48.   
  49. public void testSpEL() {  
  50.   
  51.     //设“值域”,限定在u这个对象里  
  52.     EvaluationContext context = new StandardEvaluationContext(user);    
  53.     ExpressionParser parser = new SpelExpressionParser();  
  54.     Expression exp = parser.parseExpression("username"); //==user.getUsername()  
  55.     System.out.println((String)exp.getValue(context));  //结果:xiaoling  
  56.   
  57.  }  
  58.   
  59. 或者用更简洁的一个方式 :  
  60.   System.out.println((String)exp.getValue(user));  
  61. 这样就不用设值域了!呵呵!  
  62.   
  63.    
  64.   
  65. 第五个例子:给对象中的属性设值  
  66.   
  67. StandardEvaluationContext  context = new StandardEvaluationContext(user);  
  68.   
  69. parser.parseExpression("username").setValue(context, "ling");  
  70.   
  71.    
  72.   
  73. 第六个例子:做判断  
  74.   
  75. Expression exp=parser.parseExpression("name=='xiaoling' ");  
  76. boolean result=exp.getValue(context,Boolean.class);  //evaluate stotrue  
  77.   
  78. 打印出来,结果为true  
  79.   
  80.    
  81.   
  82. 看到这,可能你还是一头雾水:这算什么新特性啊,哪有什么用处!  
  83.   
  84. 用处就在于,SpEL把java变成“动”的了!(纯属我个人观点!!)  
  85.   
  86.    
  87.   
  88. 接下来,我们把SpEL用到bean.xml中去  
  89.   
  90. 先看个例子(例一)  
  91.   
  92. <bean id="numberGuess" class="cn.ling.spel.NumberGuess">  
  93.    <property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>  
  94.   
  95. </bean>  
  96.   
  97. 怎么样,可以在xml文件里面赋值了!呵呵!  
  98.   
  99. value里面都用#{}来赋值。至于T(java.lang.Math),它是指某个类,即Math这个类。  
  100.   
  101.    
  102.   
  103. 看这个例子(例二):systemProperties  
  104.   
  105. <property name="defaultLocale" value="#{systemProperties['user.region']}"/>  
  106.   
  107. systemProperties是预定义好的,里面有很属性可以用,它就相当于java文件中的System.getProperty("user.region"),它能取出当前计算机所在的国家。  
  108.   
  109.    
  110.   
  111. 例三:引用xml里面的其它bean  
  112.   
  113. <bean id="numberGuess" class="org.spring.samples.NumberGuess">  
  114. <property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>  
  115. <!--otherproperties-->  
  116. </bean>  
  117. <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">  
  118. <property name="initialShapeSeed" value="#{numberGuess.randomNumber}"/>  
  119. <!--otherproperties-->  
  120. </bean>  
  121.   
  122.    
  123.   
  124. SpEL还可以用在annotation中:  
  125.   
  126. 例一:用在属性上  
  127.   
  128. public static class FieldValueTestBean{  
  129.    @Value("#{systemProperties['user.region']}")  
  130.    private String defaultLocale;  
  131.   
  132.    //set和get方法  
  133.    public void setDefaultLocale(StringdefaultLocale) {  
  134.       this.defaultLocale=defaultLocale;  
  135.    }  
  136.   
  137.    public StringgetDefaultLocale(){  
  138.       returnthis.defaultLocale;  
  139.    }  
  140. }  
  141.   
  142. 例二:用在方法上  
  143.   
  144. public static class PropertyValueTestBean{  
  145.    private String defaultLocale;  
  146.    @Value("#{systemProperties['user.region']}")  
  147.    public void setDefaultLocale(String defaultLocale){  
  148.       this.defaultLocale=defaultLocale;  
  149.    }  
  150.    public String getDefaultLocale(){  
  151.       return this.defaultLocale;  
  152.    }  
  153.   
  154. }  
  155. }  
  156.   
  157. 例三:Autowired和构造器中  
  158.   
  159. public class SimpleMovieLister{  
  160.    private MovieFinder movieFinder;  
  161.    private String defaultLocale;  
  162.    @Autowired  
  163.    public void configure(MovieFinder movieFinder,  
  164.       @Value("#{systemProperties['user.region']}"}String defaultLocale){  
  165.          this.movieFinder=movieFinder;  
  166.          this.defaultLocale=defaultLocale;  
  167.       }  
  168. //...  
  169. }  
  170.   
  171. 未完待续…………  

深圳人才网 深圳招聘网 深圳人才招聘网 深圳人才大市场 

企业、个人免费注册,获取想要的 深圳 软件工程师招聘信息 月薪最低3000-8000,更有高端猎头职位! 

www.szrcwz.com                                                                                                                                           

                  Google 提供的广告

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics