Spring Expression Language (SpEL) 是一個強大的表達式語言,運行時解析並賦值給 Bean 屬性。語法用 #{...} 界定,功能遠超舊 EL:支持方法調用、運算、正則、集合操作、靜態成員訪問等。
| 類型 | 示例 | XML 配置 |
|---|---|---|
| 整數 | 23 | <property name="age" value="#{23}"/> |
| 小數 | 2300.55 | <property name="salary" value="#{2300.55}"/> |
| 科學計數法 | 1e4 (=10000) | <property name="salary" value="#{1e4}"/> |
| 字符串 | 'emp01' 或 "emp01" | <property name="empName" value="#{'emp01'}"/> |
| 布爾值 | false | <property name="formal" value="#{false}"/> |
<bean id="employee" class="..." p:empName="#{'emp01'}" p:age="#{23}"/>
<bean id="department" class="..." p:deptName="#{'dept01'}" p:employee="#{employee}"/>
<bean id="department2" class="..." p:deptName="AAAA" p:employee-ref="employee"/>
<bean id="department" class="..." p:deptName="#{department2.deptName}" p:employee="#{employee}"/>
輸出:Department{deptName='AAAA', employee=Employee{empName='emp01', age=23}}
<property name="deptName" value="#{department2.deptName.toString().toLowerCase()}"/>
輸出:deptName='aaaa'
| 類別 | 運算符 | 示例 | 結果 |
|---|---|---|---|
| 算術 | + - * / % ^ | #{53.32 + 12.23} | 65.55 |
| 字符串連接 | + | #{'emp01' + ' ' + 12} | emp01 12 |
| 比較 | < > == <= >= lt gt eq le ge | #{100 == 100} | true |
| 邏輯 | and or not | | #{100 == 100 and 100 gt 80} | true |
| 三元 | ? : | #{100 == 100 ? false : true} | false |
| 正則匹配 | matches | #{'a@b.com' matches '^\\w+@\\w+\\.\\w+$'} | true/false |
通過 T(全限定類名) 獲取 Class 對象,再訪問靜態成員。
<property name="salary" value="#{T(java.lang.Math).PI * 1000}"/>
輸出:salary=3141.592653589793
<!-- List 選取 -->
#{myList[0]} <!-- 第一個元素 -->
#{myList.?[value > 10]} <!-- 過濾 -->
#{myList.^[value > 10]} <!-- 第一個匹配 -->
#{myList.$[value > 10]} <!-- 最後一個匹配 -->
<!-- Map 選取 -->
#{myMap['key']} <!-- 獲取值 -->
#{myMap.?[value > 10]} <!-- 過濾 -->
PropertyPlaceholderConfigurer 解析,性能更好,職責單一。@Value 配合 SpelExpressionParser 程序化解析。@Value("#{systemProperties['user.region']}") 注入系統屬性。