一、SpEL:Spring 表達式語言,在使用的時候類似於 EL 表達式,但是需要注意的是,SpEL 使用在 Spring Config 文件中。
二、格式:使用 #{} 作為界定符,所有在大括號中的字符都將被認為成是 SeEL
三、作用:
1.通過 Bean 的 id 對 Bean 進行引用
2.調用方法以及引用對象中的屬性
3.計算表達式的值
4.正則表達式的匹配
四、SpEL 字面值:
1.整數:<property name="age" value="#{23}"/>
2.小數:<property name="salary" value="#{2300.55}"/>
3.科學計數法:<property name="salary" value="#{1e4}"/>
4.字符串:<property name="empName" value="#{'emp01'}"/> 或 <property name='empName' value='#{"emp01"}'/>
5.布爾值:<property name="formal" value="#{false}"/>
五、引用 Bean、屬性和方法
1.引用其他 Bean:
<bean class="com.nucsoft.spring.bean.Employee" id="employee"> <property name='empName' value='#{"emp01"}'/> <property name="age" value="#{23}"/> </bean> <bean class="com.nucsoft.spring.bean.Department" id="department"> <property name="deptName" value="#{'dept01'}"/> <property name="employee" value="#{employee}"/> </bean>
2.引用其他 Bean 的屬性
<bean class="com.nucsoft.spring.bean.Employee" id="employee"> <property name='empName' value='#{"emp01"}'/> <property name="age" value="#{23}"/> </bean> <bean class="com.nucsoft.spring.bean.Department" id="department2" p:deptName="AAAA" p:employee-ref="employee"> </bean> <bean class="com.nucsoft.spring.bean.Department" id="department"> <property name="deptName" value="#{department2.deptName}"/> <property name="employee" value="#{employee}"/> </bean>
控制台輸出:
Department{deptName='AAAA', employee=Employee{empName='emp01', age=23}}
注意:引用其他 Bean 的屬性是通過 getXxx() 方法來引用的
3.調用方法,支持鏈式操作
<bean class="com.nucsoft.spring.bean.Department" id="department"> <property name="deptName" value="#{department2.deptName.toString().toLowerCase()}"/> <property name="employee" value="#{employee}"/> </bean>
控制台輸出:
Department{deptName='aaaa', employee=Employee{empName='emp01', age=23}}
六、SpEL 支持的運算
1.數學運算符:+,-,*,/,%,^
+:
<bean class="com.nucsoft.spring.bean.Employee" id="employee"> <property name='empName' value='#{"emp01"}'/> <property name="age" value="#{23}"/> <property name="salary" value="#{53.32 + 12.23}"/> </bean>
控制台輸出:
Employee{empName='emp01', age=23, salary=65.55}
其他運算符使用類似。
2.字符串連接:+
<property name='empName' value='#{"emp01" +" "+ 12}'/>
控制台輸出:
Employee{empName='emp01 12', age=23, salary=-41.09}
3.比較運算符:<,>,==,<=,>=,lt,gt,eq,le,ge
<property name="formal" value="#{100 == 100}"/>
控制台輸出:
Employee{empName='emp01 12', age=23, salary=-41.09, formal=true}
4.邏輯運算符:and,or,not,|
<property name="formal" value="#{100 == 100 and 100 gt 80}"/>
控制台輸出:
Employee{empName='emp01 12', age=23, salary=-41.09, formal=true}
其他幾個與之類似。
5.if-else 運算符:? exp1 : exp2
<property name="formal" value="#{100 == 100 ? false : true}"/>
控制台輸出:
Employee{empName='emp01 12', age=23, salary=-41.09, formal=false}
6.正則表達式:matches
<property name="matchesEmail" value="#{'[email protected]' matches '/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})'}"/>
控制台輸出:
isMatchesEmail=false
七、調用靜態方法或靜態屬性。通過 T(), 返回一個類的對象
<property name="salary" value="#{T(java.lang.Math).PI * 1000}"/>
控制台輸出:
salary=3141.592653589793