快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京返水_龟发之家论坛



什么是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设置设置设备摆设摆设中的

标签,* SpringEL同样支持在XML

中编写

*/

// 注入简单值,输出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.showPr澳门新葡新京返水operty('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 )private boolean logicOperation;

// 进行或非逻辑操作

@Value("#{ not testConstant.num == 100 or testConstant.num )private boolean logicOperation2;

// 应用三元运算符

@Value("#{te澳门新葡新京返水stConstant.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中增添properties文件

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聚拢po澳门新葡新京返水pulation属性大年夜于1000的整个数据注入到本属性

@Value("#{testConstant.cityList.?[population > 1000]}")private List cityList;

// 过滤testConstant中cityList聚拢population属性即是1000的第一条数据注入到本属性

@Value("#{testConstant.cityList.^[population == 1000]}")private City city;

// 过滤testConstant中cityList聚拢population属性小于1000的着末一条数据注入到本属性

@Value("#{testCons澳门新葡新京返水tant.cityList.$[population )private City city2;

/*

* 首先为city增添name属性,代表城市的名称*/

/*

* 要是我们在过滤城市聚拢后只想保留城市的名称,* 可以应用如下要领进行投影

*/@Value("#{testConstant.cityList.?[population > 1000].![name]}")

private List cityName;

优点:SpringEL功能异常强大年夜,在Annotation的要领开拓时可能感到并不强烈,由于可以直接编写到源代码来实现SpringEL的功能,但若然是在XML文件中进行设置设置设备摆设摆设,SpringEL可以增补XML静态注入的不够,从而实现更强大年夜的注入

毛病:SpringEL在应用时仅仅是一个字符串,不易于排错与测试,也没有IDE反省我们的语法,当呈现差错时较难检测

笔者实际利用:笔者开拓的项目傍边对照频繁的应用SpringEL,例如经由过程SpringEL获取外部properties中的值,又或者项目傍边的数据字典亦是应用SpringEL的一个场景,我们抽象出一个Param类的聚拢,经由过程SpringEL聚拢筛选和投影获取我们想要的字段参数添加到我们的法度榜样逻辑傍边(笔者项目中的Spring Security亦应用SpringEL,但本文章不加以论述)

总结:Spring3.0让工资之惊艳的非SpringEL莫属,为我们的注入供给了另一种强大年夜的形式,传统注入能做到的工作,和做不到的工作,SpringEL一概能完成,但在项目傍边并不合适大年夜量应用SpringEL,适当的技巧方在适当的位置,才能更好的完成工作

您可能还会对下面的文章感兴趣: