相对来讲, 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中去
先看个例子(例一)
<bean id="numberGuess" class="cn.ling.spel.NumberGuess">
<property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>
</bean>
怎么样,可以在xml文件里面赋值了!呵呵!
value里面都用#{}来赋值。至于T(java.lang.Math),它是指某个类,即Math这个类。
看这个例子(例二):systemProperties
<property name="defaultLocale" value="#{systemProperties['user.region']}"/>
systemProperties是预定义好的,里面有很属性可以用,它就相当于java文件中的System.getProperty("user.region"),它能取出当前计算机所在的国家。
例三:引用xml里面的其它bean
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
<property name="randomNumber" value="#{T(java.lang.Math).random()*100.0}"/>
<!--otherproperties-->
</bean>
<bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
<property name="initialShapeSeed" value="#{numberGuess.randomNumber}"/>
<!--otherproperties-->
</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;
}
//...
}
未完待续…………
分享到:
相关推荐
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
3. **支持表达式**:Spring Security引入了基于SpEL的安全表达式,提供了更灵活的访问控制。 4. **模块化**:Spring Security分为多个模块,如Web安全、方法安全等,更易于定制和扩展。 通过学习Acegi,我们可以...
以上内容涵盖了Spring框架的关键知识点,从IoC和DI的使用,到AOP和资源管理,再到强大的SpEL表达式语言,这些都是理解和掌握Spring框架所必备的基础。通过深入学习这些内容,不仅有助于日常开发,也能为面试做好充分...
本篇学习笔记主要探讨了Spring中的属性注入方式,包括了传统的XML配置注入、注解式注入以及使用Java配置类的方式。 一、XML配置注入 在Spring早期版本中,XML配置文件是定义Bean及其依赖关系的主要方式。属性注入...
【Spring 3.x 读书笔记-1】 Spring 框架是 Java 开发中的核心组件,尤其在企业级应用开发中扮演着至关重要的角色。Spring 3.x 版本是其发展过程中的一个重要里程碑,引入了许多新特性和增强功能。在本篇读书笔记中...
### Spring学习笔记知识点详解 #### 一、Spring学习模块概览 Spring框架作为一个全面而强大的企业级应用开发框架,其内部包含多个模块,这些模块分别针对不同的应用场景和技术领域进行了优化设计。了解这些模块有...
- **表达式式访问控制**:使用@PreAuthorize、@PostAuthorize等注解,配合SpEL(Spring Expression Language)表达式进行细粒度的访问控制。 6. **集成其他Spring模块** - **Spring MVC**:与Spring Web MVC无缝...
总的来说,《Spring2.5 学习笔记》这份文档将带领读者深入了解Spring2.5的各种核心特性,包括注解驱动的配置、依赖注入的优化、面向切面编程的实现、数据库访问的便捷性、Web MVC的改进以及SpEL的运用。通过对这些...
在本篇"Spring学习笔记(四)"中,我们将深入探讨Spring框架的核心特性和使用方法,尤其是围绕源码解析和工具应用这两个主题。Spring是Java领域中最广泛应用的轻量级框架,它提供了丰富的功能来简化企业级应用的开发,...
【Spring学习笔记 私塾在线】是一份综合性的学习资源,包含了从网上收集的各种Spring相关的教程和实战指导。这份笔记的目的是为学习者提供一个全面的Spring框架学习平台,通过集成多个主题,帮助用户深入理解和掌握...
《Spring 2.5 学习笔记》 在IT领域,Spring框架是Java企业级应用开发的首选框架,而Spring 2.5是其发展历史中的一个重要里程碑。本笔记将深入探讨Spring 2.5的核心特性,帮助读者理解并掌握这一版本的精髓。 一、...
在本篇“Spring学习笔记之二‘属性注入’”中,我们将深入探讨Spring如何实现属性注入,并通过实例展示其工作原理。 1. **属性注入的概念** 属性注入是指Spring容器通过XML配置或者基于注解的方式,将外部资源(如...
【标题】"Spring学习笔记(三)"主要涵盖了Spring框架的核心概念和使用,特别是关于Spring的依赖注入(Dependency Injection,简称DI)以及AOP(面向切面编程)的应用。这篇笔记可能详细介绍了如何通过XML配置或者Java...
### Spring学习笔记:深入探索SpEL(Spring Expression Language) #### SpEL简介 SpEL,即Spring Expression Language(Spring表达式语言),是Spring框架提供的一种强大的表达式语言,用于在运行时查询和操作...
例如,我们可以使用SpEL表达式在运行时决定bean的属性值。此外,PropertyPlaceholderConfigurer和Environment抽象类是处理属性文件和环境变量的重要组件,它们帮助我们读取和替换配置文件中的占位符,使得配置更加...
这篇教程的学习笔记将带你深入理解其核心概念和工作原理。首先,我们来概述 Spring Security 的基本架构和主要组件。 **1. ** **Spring Security 架构** Spring Security 的架构基于过滤器链,它拦截并处理应用...
Spring Security 是一个强大的Java安全框架,用于...总的来说,Spring Security 3的学习笔记和源码分析对提升安全开发技能大有裨益,不仅可以加深理论理解,还能在实际项目中灵活运用,构建更加健壮、安全的应用系统。
5. **spring-expression.jar**(Spring Expression Language - SpEL):SpEL是Spring提供的表达式语言,用于在运行时查询和操作对象图。在配置文件中,我们可以使用SpEL来动态地评估属性值。 6. **spring-web.jar**...
总结来说,SpringBoot学习笔记和实践源码是理解并掌握Spring Boot框架的重要资源。通过理论学习与实际操作相结合,开发者能够迅速上手Spring Boot,从而提升开发效率,构建出健壮、易维护的Java应用。
Spring Security 提供了一种表达式语言(SpEL,Spring Expression Language),用于在访问控制规则中表达复杂的条件。例如,`hasRole('ROLE_ADMIN')` 和 `hasPermission(#object, 'READ')` 分别表示用户是否具有管理...