`
ray_yui
  • 浏览: 220787 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SpringEL详解及应用

阅读更多

什么是SpringEL?
      Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JDK中提供的静态常量,获取外部Properties文件中的的配置


为什么要使用SpringEL?
      我们平常通过配置文件或Annotaton注入的Bean,其实都可以称为静态性注入,试想一下,若然我Bean A中有变量A,它的值需要根据Bean B的B变量为参考,在这场景下静态注入就对这样的处理显得非常无力,而Spring3增加的SpringEL就可以完全满足这种需求,而且还可以对不同Bean的字段进行计算再进行赋值,功能非常强大


如何使用SpringEL?
      SpringEL从名字来看就能看出,和EL是有点关系的,SpringEL的使用和EL表达式的使用非常相似,EL表达式在JSP页面更方便的获取后台中的值,而SpringEL就是为了更方便获取Spring容器中的Bean的值,EL使用${},而SpringEL使用#{}进行表达式的声明

      使用SpringEL注入简单值

public class TestSpringEL {

	/*
	 * @Value注解等同于XML配置中的<property/>标签, 
	 * SpringEL同样支持在XML<property/>中编写
	 */

	// 注入简单值,输出num为5
	@Value("#{5}")
	private Integer num;

	// 注入ID为testConstant的Bean
	@Value("#{testConstant}")
	private TestConstant Constant;

	// 注入ID为testConstant Bean中的STR常量/变量
	@Value("#{testConstant.STR}")
	private String str;

}


      使用SpringEL调用方法

public class TestSpringEL {

	/*
	 * TestConstant类中有两个方法重载,
	 * 返回值为String类型
	 */

	// 调用无参方法
	@Value("#{testConstant.showProperty}")
	private String method1;

	
	// 有参接收字符串的方法
	@Value("#{testConstant.showProperty('Hello')}")
	private String method2;

	
	/*
	 * 若然希望方法返回的String为大写
	 */
	@Value("#{testConstant.showProperty().toUpperCase()}")
	private String method3;

	
	/*
	 * 若使用method3这种方式,若然showProperty返回为null, 
	 * 将会抛出NullPointerException,可以使用以下方式避免
	 */
	@Value("#{testConstant.showProperty()?.toUpperCase}")
	private String method4;
	/*
	 * 使用?.符号代表若然左边的值为null,将不执行右边方法, 
	 * 读者可以灵活运用在其他场景,只要左边可能返回null,
	 * 即可使用上面示例中的?.
	 */
}


      SpringEL调用静态类或常量

public class TestSpringEL {

	/*
	 * 注入JDK中的工具类常量或调用工具类的方法
	 */

	// 获取Math的PI常量
	@Value("#{T(java.lang.Math).PI")
	private double pi;

	// 调用random方法获取返回值
	@Value("#{T(java.lang.Math).random()}")
	private double ramdom;

	// 获取文件路径符号
	@Value("#{T(java.io.File).separator}")
	private String separator;
}


      SpringEL运算

public class TestSpringEL {

	/*
	 * 使用SpringEL进行运算及逻辑操作
	 */

	// 拼接字符串
	@Value("#{testConstant.nickname + ' ' + testConstant.name}")
	private String concatString;

	// 对数字类型进行运算,testConstant拥有num属性
	@Value("#{ 3 * T(java.lang.Math).PI + testConstant.num}")
	private double operation;

	// 进行逻辑运算
	@Value("#{testConstant.num > 100 and testConstant.num <= 200}")
	private boolean logicOperation;

	// 进行或非逻辑操作
	@Value("#{ not testConstant.num == 100 or testConstant.num <= 200}")
	private boolean logicOperation2;

	// 使用三元运算符
	@Value("#{testConstant.num > 100 ? testConstant.num : testConstant.num + 100}")
	private Integer logicOperation3;
}


      SpringEL使用正则表达式

public class TestSpringEL {
	// 验证是否邮箱地址正则表达式
	@Value("#{testConstant.STR match '\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+'}")
	private boolean regularExpression;
}


      SpringEL操作集合

public class TestSpringEL {

	/*
	 * TestConstant类中拥有名为testList的List变量, 和名为testMap的Map
	 */

	// 获取下标为0的元素
	@Value("#{testConstant.testList[0]}")
	private String str;

	// 获取下标为0元素的大写形式
	@Value("#{testConstant.testList[0]?.toUpperCase()}")
	private String upperStr;

	// 获取map中key为hello的value
	@Value("#{testConstant.testMap['hello']}")
	private String mapValue;

	// 根据testList下标为0元素作为key获取testMap的value
	@Value("#{testConstant.testMap[testConstant.testList[0]]}")
	private String mapStrByTestList;
}


      Spring操作外部Properties文件


      首先通过applicaContext.xml中<util:properties>增加properties文件

<!-- 注意需要引入Spring的util schemea命名空间和注意id属性,id属性将在SpringEL中使用 -->
	<util:properties id="test" location="classpath:application.properties" />

public class TestSpringEL {

	// 注意test为xml文件中声明的id
	@Value("#{test['jdbc.url']}")
	private String propertiesValue;
}


      SpringEL查询筛选集合和投影

public class TestSpringEL {

	/*
	 * 声明City类,有population属性 testContants拥有名叫cityList的City类List集合
	 */

	// 过滤testConstant中cityList集合population属性大于1000的全部数据注入到本属性
	@Value("#{testConstant.cityList.?[population > 1000]}")
	private List<City> cityList;

	// 过滤testConstant中cityList集合population属性等于1000的第一条数据注入到本属性
	@Value("#{testConstant.cityList.^[population == 1000]}")
	private City city;

	// 过滤testConstant中cityList集合population属性小于1000的最后一条数据注入到本属性
	@Value("#{testConstant.cityList.$[population < 1000]}")
	private City city2;

	/*
	 * 首先为city增加name属性,代表城市的名称
	 */
	
	/*
	 * 假如我们在过滤城市集合后只想保留城市的名称,
	 * 可以使用如下方式进行投影
	 */
	@Value("#{testConstant.cityList.?[population > 1000].![name]}")
	private List<String> cityName;


      优点:SpringEL功能非常强大,在Annotation的方式开发时可能感觉并不强烈,因为可以直接编写到源代码来实现SpringEL的功能,但若然是在XML文件中进行配置,SpringEL可以弥补XML静态注入的不足,从而实现更强大的注入

      缺点:SpringEL在使用时仅仅是一个字符串,不易于排错与测试,也没有IDE检查我们的语法,当出现错误时较难检测


      笔者实际应用:笔者开发的项目当中比较频繁的使用SpringEL,例如通过SpringEL获取外部properties中的值,又或者项目当中的数据字典亦是使用SpringEL的一个场景,我们抽象出一个Param类的集合,通过SpringEL集合筛选和投影获取我们想要的字段参数添加到我们的程序逻辑当中(笔者项目中的Spring Security亦使用SpringEL,但本文章不加以叙述)


      总结:Spring3.0让人为之惊艳的非SpringEL莫属,为我们的注入提供了另一种强大的形式,传统注入能做到的事情,和做不到的事情,SpringEL一概能完成,但在项目当中并不适宜大量使用SpringEL,适当的技术方在适当的位置,才能更好的完成事情
39
41
分享到:
评论
8 楼 wap816 2016-04-29  
           @CacheEvict(value = "replyService", key = "#reply.getTopicid()+'0'"),
            @CacheEvict(value = "replyService", key = "#reply.getTopicid()+'1'"),
            @CacheEvict(value = "replyService", key = "#reply.getTopicid()+'2'"),
             ......
            @CacheEvict(value = "replyService", key = "#reply.getTopicid()+'50'"),
            ......
            @CacheEvict(value = "replyService", key ="#reply.getTopicid()+'5000'"),


请问楼主用一句语句 怎么写啊.谢谢
7 楼 hoarhoar 2013-09-23  
类似支持lambda表达式了,非常好。
6 楼 baitian 2013-09-23  
有個毛用,
5 楼 ray_yui 2013-09-22  
mlw2000 写道
当然也可以做危险的事情,比如存在被注入调用System.exit(0)的风险不?

理论上可以的,但还是别那样做好
4 楼 ray_yui 2013-09-22  
hearme1991 写道
写得很不错,非常有用。不过楼主大概误解了“若然”一词的意义,致使文章中多处出现该词不恰当的用法。

非常感谢支持,去查了一下新华字典,若然的意思是1.如果这样。 2.如果。 3.如此,应该没用错吧
3 楼 hearme1991 2013-09-22  
写得很不错,非常有用。不过楼主大概误解了“若然”一词的意义,致使文章中多处出现该词不恰当的用法。
2 楼 mlw2000 2013-09-22  
当然也可以做危险的事情,比如存在被注入调用System.exit(0)的风险不?
1 楼 zsf513 2013-09-22  
谢谢LZ,非常有用的文章。

相关推荐

    EL表达式 (详解)

    ### EL表达式详解 #### 一、EL表达式概述 **1.1 EL简介** - **语法结构**:EL表达式的基本语法结构是`${expression}`,其中`expression`表示一个合法的表达式。 - **运算符**:EL支持两种运算符来访问数据:`.`...

    SPRING2.0开发详解

    ### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...

    (JSP应用开发详解)JSP应用开发详解

    【JSP应用开发详解】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发工具,主要用于构建服务器端的...在实际项目中,不断实践和探索,结合标签库和框架,如Spring MVC,将进一步提升开发效率和应用质量。

    jsp应用开发详解.zip

    【JSP应用开发详解】 JavaServer Pages(JSP)是一种基于Java的技术,用于创建动态网页。JSP在Web开发领域中扮演着重要角色,因为它允许开发者将HTML代码与Java代码混合编写,使得网页内容能够根据服务器端的数据...

    jsp应用开发详解(中文高清pdf版)

    《jsp应用开发详解》这本书是Java服务器页面(JSP)技术的权威指南,它深入剖析了JSP的各个方面,帮助开发者全面掌握这一Web应用程序开发的重要技术。以下是对书中的主要知识点进行的详细解读: 1. **JSP基础**:...

    JSP应用开发详解下载

    **JSP应用开发详解** JavaServer Pages(JSP)是一种基于Java的技术,用于构建动态Web应用程序。它将HTML代码与Java代码分离,使得开发者可以更专注于网页的展示逻辑,而服务器端的业务处理则由Java代码来完成。JSP...

    jsp应用开发详解.pdf

    **JSP应用开发详解** JavaServer Pages(JSP)是一种基于Java的技术,用于构建动态Web应用程序。它将HTML代码与Java代码分离,使得开发者可以更专注于网页的展示逻辑,而服务器端则处理业务逻辑。本篇文章将深入...

    jsp应用开发详解 jsp电子书

    **JSP应用开发详解** JavaServer Pages(JSP)是一种基于Java技术的动态网页开发工具,它允许开发者在HTML、XML或者其他标记语言中嵌入Java代码,以实现服务器端的程序逻辑。JSP的出现极大地简化了Web应用程序的...

    《JSP应用开发详解》随书光盘

    - MVC框架(如Spring MVC)与JSP的结合,提升Web应用的架构设计。 通过《JSP应用开发详解》这本书的学习,读者不仅能够全面掌握JSP技术,还能了解到Java Web开发的全貌,从而提高开发效率和代码质量。光盘中的源码...

    独门架构JavaWeb开发应用详解源码

    "独门架构JavaWeb开发应用详解源码" 提供了一种独特的视角,旨在帮助开发者深入理解JavaWeb应用的架构设计与实现。这个资源可能包含了一系列的源代码文件,用于展示如何在实际项目中有效地运用JavaWeb技术。 ...

    JSP应用开发详解(飞思科技第二版)

    《JSP应用开发详解(飞思科技第二版)》是一本深入探讨JSP技术的专著,主要针对Java Server Pages的使用和实践进行详细解析。该书由飞思科技出版,旨在帮助开发者全面掌握JSP在实际项目中的应用。通过学习这本书,...

    JSP应用开发详解(第二版)

    《JSP应用开发详解(第二版)》是深入学习Java Server Pages(JSP)技术的一本权威指南。这本书涵盖了从基础概念到高级特性的全面内容,旨在帮助开发者掌握JSP的精髓并应用于实际项目开发中。以下是根据章节标题和...

    独门架构——JavaWeb开发应用详解(电子版)

    《独门架构——JavaWeb开发应用详解》是一本深度探讨JavaWeb开发技术的专业书籍,旨在帮助已经具备Java基础知识的学习者和开发者进一步提升在Web领域的专业技能。本书详细讲解了JavaWeb开发中的各种核心概念、技术和...

    Java Web开发应用详解

    《Java Web开发应用详解》是一本深度探讨Java Web技术的专业书籍,旨在帮助开发者全面理解并掌握Java在Web领域的应用。本书可能涵盖了从基础概念到高级技术的诸多方面,包括Servlet、JSP、JavaServer Faces(JSF)、...

    J2EE应用开发详解

    内容为J2EE应用开发详解中的源代码 第1章 Java Web应用开发简介 1 1.1 Java EE应用概述 1 1.2 Java EE概念 1 1.2.1 Java EE多层模型 1 1.2.2 Java EE体系结构 2 1.3 Java EE的核心API与组件 4 1.4 Web服务器和应用...

    JSP应用开发详解》原版 (PDF)

    《JSP应用开发详解》是一本深入探讨JavaServer Pages(JSP)技术的专业书籍,旨在帮助读者全面理解和掌握JSP的各个核心概念、特性和实际应用。PDF版本提供了方便的电子阅读体验,使得开发者可以随时随地查阅和学习。...

    基于Spring MVC的web应用

    **Spring MVC 框架详解** Spring MVC 是 Spring 框架的一个模块,它为构建 Web 应用程序提供了一种模型-视图-控制器(MVC)架构。这个框架使得开发者可以将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性...

    Jsp应用开发详解

    **JSP应用开发详解** JavaServer Pages(JSP)是一种基于Java的技术,用于构建动态Web应用程序。它将HTML代码与Java代码分离,使得开发者可以更专注于网页的展示逻辑,而服务器端的业务处理则由Java代码负责。在JSP...

    J2EE应用开发详解(罗玉玲版)光盘内容(源代码)

    《J2EE应用开发详解(罗玉玲版)》是一本深入探讨J2EE平台下应用程序开发的专业书籍,其中的光盘内容包含了源代码,为读者提供了实践学习的宝贵资源。J2EE(Java 2 Platform, Enterprise Edition)是Java语言在企业...

    JSP应用开发详解

    **JSP应用开发详解** JavaServer Pages(JSP)是一种基于Java的技术,用于创建动态、交互式的Web应用程序。它将HTML、CSS、JavaScript等呈现逻辑与服务器端的Java代码分离,使得开发者可以更加专注于业务逻辑的实现...

Global site tag (gtag.js) - Google Analytics