最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于springEL表達式詳解及應用

 更新時間:2021年08月20日 09:24:42   作者:青魚入云  
這篇文章主要介紹了springEL表達式詳解及應用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

基于springEL表達式詳解及應用

什么是SpringEL?

Spring3中引入了Spring表達式語言—SpringEL,SpEL是一種強大,簡潔的裝配Bean的方式,他可以通過運行期間執(zhí)行的表達式將值裝配到我們的屬性或構造函數(shù)當中,更可以調用JDK中提供的靜態(tài)常量,獲取外部Properties文件中的的配置

為什么要使用SpringEL?

我們平常通過配置文件或Annotaton注入的Bean,其實都可以稱為靜態(tài)性注入,試想一下,若然我Bean A中有變量A,它的值需要根據Bean B的B變量為參考,在這場景下靜態(tài)注入就對這樣的處理顯得非常無力,而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,將不執(zhí)行右邊方法, 
  * 讀者可以靈活運用在其他場景,只要左邊可能返回null,
  * 即可使用上面示例中的?.
 */
}

SpringEL調用靜態(tài)類或常量

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;
 
 // 對數(shù)字類型進行運算,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的全部數(shù)據注入到本屬性
 @Value("#{testConstant.cityList.?[population > 1000]}")
 private List<City> cityList;
 
 // 過濾testConstant中cityList集合population屬性等于1000的第一條數(shù)據注入到本屬性
 @Value("#{testConstant.cityList.^[population == 1000]}")
 private City city;
 
 // 過濾testConstant中cityList集合population屬性小于1000的最后一條數(shù)據注入到本屬性
 @Value("#{testConstant.cityList.$[population < 1000]}")
 private City city2;
 
 /*
  * 首先為city增加name屬性,代表城市的名稱
 */
 
 /*
  * 假如我們在過濾城市集合后只想保留城市的名稱,
  * 可以使用如下方式進行投影
 */
 @Value("#{testConstant.cityList.?[population > 1000].![name]}")
 private List<String> cityName;
}

優(yōu)點:

SpringEL功能非常強大,在Annotation的方式開發(fā)時可能感覺并不強烈,因為可以直接編寫到源代碼來實現(xiàn)SpringEL的功能,但若然是在XML文件中進行配置,SpringEL可以彌補XML靜態(tài)注入的不足,從而實現(xiàn)更強大的注入

缺點:

SpringEL在使用時僅僅是一個字符串,不易于排錯與測試,也沒有IDE檢查我們的語法,當出現(xiàn)錯誤時較難檢測

筆者實際應用:

筆者開發(fā)的項目當中比較頻繁的使用SpringEL,例如通過SpringEL獲取外部properties中的值,又或者項目當中的數(shù)據字典亦是使用SpringEL的一個場景,我們抽象出一個Param類的集合,通過SpringEL集合篩選和投影獲取我們想要的字段參數(shù)添加到我們的程序邏輯當中(筆者項目中的Spring Security亦使用SpringEL,但本文章不加以敘述)

總結:

Spring3.0讓人為之驚艷的非SpringEL莫屬,為我們的注入提供了另一種強大的形式,傳統(tǒng)注入能做到的事情,和做不到的事情,SpringEL一概能完成,但在項目當中并不適宜大量使用SpringEL,適當?shù)募夹g方在適當?shù)奈恢?,才能更好的完成事情?/p>

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)簡易五子棋小游戲

    Java實現(xiàn)簡易五子棋小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java讀寫excel文件實現(xiàn)POI解析Excel的方法

    java讀寫excel文件實現(xiàn)POI解析Excel的方法

    在日常工作中,我們常常會進行Excel文件讀寫操作,這篇文章主要介紹了java讀寫excel文件實現(xiàn)POI解析Excel的方法,實例分析了java讀寫excel的技巧,非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Java實現(xiàn)CSV格式轉對象

    Java實現(xiàn)CSV格式轉對象

    csv全稱“Comma-Separated Values”,是一種逗號分隔值格式的文件,常用來存儲數(shù)據的純文本格式文件。本文將用Java語言實現(xiàn)CSV轉對象,需要的可以參考一下
    2022-06-06
  • 詳解spring cloud config實現(xiàn)datasource的熱部署

    詳解spring cloud config實現(xiàn)datasource的熱部署

    這篇文章主要介紹了詳解spring cloud config實現(xiàn)datasource的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 源碼分析Spring?中?@Qualifier?注解基本用法

    源碼分析Spring?中?@Qualifier?注解基本用法

    這篇文章主要介紹了源碼分析Spring?中?@Qualifier?注解基本用法,在源碼分析的過程中,也?GET?到?Spring?許多新的玩法,感興趣的小伙伴趕緊去試試吧
    2023-08-08
  • java實現(xiàn)潛艇大戰(zhàn)游戲源碼

    java實現(xiàn)潛艇大戰(zhàn)游戲源碼

    潛艇大戰(zhàn)游戲相信大家都玩過,是一款非常有趣的小游戲,那么基于代碼是如何實現(xiàn)的呢?今天小編給大家?guī)硪黄坛處椭蠹覍W習java實現(xiàn)潛艇大戰(zhàn)游戲,感謝的朋友一起看看吧
    2021-06-06
  • Idea 快速生成方法返回值的操作

    Idea 快速生成方法返回值的操作

    這篇文章主要介紹了Idea 快速生成方法返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Intellij IDEA實現(xiàn)SpringBoot項目多端口啟動的兩種方法

    Intellij IDEA實現(xiàn)SpringBoot項目多端口啟動的兩種方法

    有時候使用springboot項目時遇到這樣一種情況,用一個項目需要復制很多遍進行測試,除了端口號不同以外,沒有任何不同。遇到這種情況怎么辦呢?這時候可以使用Intellij IDEA解決
    2018-06-06
  • Mybatis Plus 實現(xiàn)批量插入的示例代碼

    Mybatis Plus 實現(xiàn)批量插入的示例代碼

    本文主要介紹了Mybatis Plus 實現(xiàn)批量插入的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實現(xiàn)

    Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實現(xiàn)

    廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)是圖遍歷算法中最常見的兩種算法,主要用于解決搜索和遍歷問題。動態(tài)規(guī)劃和貪心算法則用來解決優(yōu)化問題。本文就來看看這些算法的具體實現(xiàn)吧
    2023-04-04

最新評論

阜康市| 盐亭县| 康定县| 霸州市| 兰溪市| 三河市| 遂宁市| 鱼台县| 柘城县| 府谷县| 桦南县| 襄垣县| 临高县| 兰溪市| 大英县| 奉节县| 盘锦市| 舟曲县| 广安市| 温州市| 山东省| 靖江市| 霞浦县| 平原县| 米脂县| 祁连县| 万年县| 拜泉县| 睢宁县| 沧州市| 集安市| 新巴尔虎右旗| 醴陵市| 台中市| 兴安盟| 哈尔滨市| 红安县| 合作市| 霍林郭勒市| 隆昌县| 海丰县|