什么是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\公众/>1234public 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,适当的技能方在适当的位置,才能更好的完成事情