spring之SpEL表達(dá)式詳解
1.什么是SpEL表達(dá)式
SpEL表達(dá)式語言是一種表達(dá)式語言,是一種可以與一個(gè)基于spring的應(yīng)用程序中的運(yùn)行時(shí)對象交互的東西。有點(diǎn)類似于ognl表達(dá)式??偟脕碚fSpEL表達(dá)式是一種簡化開發(fā)的表達(dá)式,通過使用表達(dá)式來簡化開發(fā),減少一些邏輯、配置的編寫。
2.SpEL表達(dá)式語言入門程序
(1)xml配置的方式
配置環(huán)境:pom.xml
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.5.RELEASE</version> </dependency> </dependencies>
applicationContext.xml文件:
<bean id="MyMessage" class="cn.spy.spel.injection.MyMessage"> ? ? ? ? <property name="message" value="#{systemProperties['user.language']}"></property> </bean>
MyMessage.java文件:
public class MyMessage { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
測試程序:
public class Test { public static void main(String[] args) { ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml"); MyMessage myMessage =context.getBean(MyMessage.class); System.out.println(myMessage.getMessage()); } }
結(jié)果:
解釋:這里使用了表達(dá)式#{systemProperties['user.language']}來設(shè)置值,用來檢索用戶語言系統(tǒng)的屬性。
(2)采用注解的方式
applicationContext.xml文件:
<context:component-scan base-package="cn.spy.spel"></context:component-scan>
MyMessage2.java文件:
@Component public class MyMessage2 { @Value("#{systemProperties['user.language']}") private String message; public String getMessage() { return message; } }
解釋:這里使用了@Value注解的方式,當(dāng)實(shí)例化MyMessage2這個(gè)bean的時(shí)候,將使用該注解設(shè)置默認(rèn)值。此處還是使用了之前的SpEL表達(dá)式,來設(shè)置用戶語言系統(tǒng)的屬性。(在這里@Value注解既可以在類的字段屬性上面,也可以在構(gòu)造函數(shù)和方法上面使用)。
測試:
public static void main(String[] args) { ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml"); MyMessage2 myMessage =context.getBean(MyMessage2.class); System.out.println(myMessage.getMessage()); }
結(jié)果:
3.分析器
SpEL上下文中所定義的每一個(gè)表達(dá)式都應(yīng)該首先被解析,然后在被評估。解析的過程采用了ExpressionParser接口的分析器進(jìn)行處理的。SpelExpressionParser主要負(fù)責(zé)將字符串表達(dá)式解析到已編譯的Expression對象中。(創(chuàng)建的分析器實(shí)例是線程安全)
代碼形式:
ExpressionParser parser =new SpelExpressionParser();
注意:
在SpEL表達(dá)式中,默認(rèn)情況下,表達(dá)式前綴為 ' # ' ,而后綴為 ' } ' 。如果表達(dá)式中沒有前綴和后綴,那么表達(dá)式字符串就被當(dāng)作純文本。
分析器解析Spel中純文本表達(dá)式HelloWorld:
public class HelloWorldTest { ExpressionParser parser; @Before public void setup(){ //初始化創(chuàng)建SpEL表達(dá)式解析器 parser =new SpelExpressionParser(); } @Test public void test(){ //使用解析器解析出表達(dá)式exp Expression exp=parser.parseExpression("'Hello World'"); //在表達(dá)式中獲取指定類型的值 String value =exp.getValue(String.class); assertThat(value ,is("Hello World")); } }
junit測試結(jié)果:
4.使用SpEL表達(dá)式調(diào)用方法
(1)使用SpEL調(diào)用普通方法
就是SpEL也支持在表達(dá)式中采用方法調(diào)用的形式
范例:
User.java:
public class User { private String username; private String password; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getUsername() { return "李四"; } public String getPassword() { return "lisi123"; } public void printUser(){ System.out.println("當(dāng)前用戶的用戶名:"+username+" ,密碼:"+password); } }
applicationContext.xml配置文件:
<bean id="user1" class="cn.spy.spel.method.User"> <property name="username" value="張三"></property> <property name="password" value="zhangsan123"></property> </bean> <bean id="user2" class="cn.spy.spel.method.User"> <property name="username" value="#{user2.getUsername()}"></property> <property name="password" value="#{user2.getPassword()}"></property> </bean>
測試:
public class TestMethod { public static void main(String[] args) { ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml"); User user1 =(User) context.getBean("user1"); user1.printUser(); User user2 =(User) context.getBean("user2"); user2.printUser(); } }
結(jié)果:
(2)使用SpEL調(diào)用構(gòu)造方法
@Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); Expression exp=parser.parseExpression("new Double(3.1415926)"); Double value =exp.getValue(Double.class); assertThat(value ,is(3.1415926)); }
結(jié)果:
(3)使用SpEL調(diào)用靜態(tài)方法
@Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); Expression exp=parser.parseExpression("T(java.lang.Math).abs(-1)"); Integer value =exp.getValue(Integer.class); assertThat(value ,is(1)); }
結(jié)果:
6.使用SpEL表達(dá)式調(diào)用變量和函數(shù)
(1)#變量的表達(dá)式使用
SpEL使用上下文StandardEvaluationContext查找表達(dá)式中存在的變量。在表達(dá)式中使用變量名稱前添加一個(gè)標(biāo)簽前綴#,使用已注冊的變量。
public class TestSpEL { @Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); StandardEvaluationContext context =new StandardEvaluationContext(); context.setVariable("message", "Hello World"); String value =parser.parseExpression("#message").getValue(context, String.class); assertThat(value, is("Hello World")); } }
結(jié)果:
(2)#root表達(dá)式的使用
可以在上下文中設(shè)置一個(gè)對象評估,可以使用#root訪問該對象。
public class TestSpEL { @Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); StandardEvaluationContext context =new StandardEvaluationContext(); context.setRootObject(new Var()); Assert.assertTrue(parser.parseExpression("#root").getValue(context) instanceof Var); } }
結(jié)果:
(3)訪問系統(tǒng)的屬性和環(huán)境
SpEL預(yù)定義變量:systemProperties和systemEnvironment
parser.parseExpression("@systemProperties['java.version']").getValue(context); parser.parseExpression("@systemProperties[JAVA_HOME]").getValue(context);
7.使用SpEL表達(dá)式中的運(yùn)算符
SpEL提供了多種運(yùn)算符。
類型 | 運(yùn)算符 |
關(guān)系 | <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne |
算術(shù) | +,- ,* ,/,%,^ |
邏輯 | &&,||,!,and,or,not,between,instanceof |
條件 | ?: (ternary),?: (elvis) |
正則表達(dá)式 | matches |
其他類型 | ?.,?[…],![…],^[…],$[…] |
注意:如果解析表達(dá)式時(shí),在完全限定的類名中包含一個(gè)運(yùn)算符的文本表示形式,則會(huì)產(chǎn)生異常。
正則表達(dá)式運(yùn)算符matches
@Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); assertThat(parser.parseExpression("35 matches '[0-9]+'").getValue(Boolean.class), is(true)); }
結(jié)果:
邏輯運(yùn)算符between
@Test public void test(){ ExpressionParser parser =new SpelExpressionParser(); assertThat(parser.parseExpression("3 between {2,5}").getValue(Boolean.class), is(true)); }
結(jié)果:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Spring中@Value使用詳解及SPEL表達(dá)式
- 詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別
- SpringDataElasticsearch與SpEL表達(dá)式實(shí)現(xiàn)ES動(dòng)態(tài)索引
- Spring AOP如何在注解上使用SPEL表達(dá)式注入對象
- 使用Springboot自定義注解,支持SPEL表達(dá)式
- 基于spring?@Cacheable?注解的spel表達(dá)式解析執(zhí)行邏輯
- Spring?Cache抽象-使用SpEL表達(dá)式解析
- Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例
- Spring組件開發(fā)模式支持SPEL表達(dá)式
- Spring spel表達(dá)式使用方法示例
- Spring中SpEL表達(dá)式的使用全解
相關(guān)文章
java獲取當(dāng)前時(shí)間的四種方法代碼實(shí)例
這篇文章主要介紹了java獲取當(dāng)前時(shí)間的四種方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09AsyncHttpClient ListenableFuture源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient ListenableFuture源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java WebSocket客戶端接收大量數(shù)據(jù)的三種方案
WebSocket是一種基于TCP協(xié)議的全雙工通信協(xié)議,它能夠在客戶端和服務(wù)器之間建立一個(gè)持久連接,實(shí)現(xiàn)實(shí)時(shí)的雙向數(shù)據(jù)傳輸,在實(shí)際應(yīng)用中,有時(shí)候我們需要處理大量的數(shù)據(jù),所以本文將介紹如何使用 Java WebSocket 客戶端接收大量數(shù)據(jù),并提供一些優(yōu)化方案2023-11-11SpringBoot集成easy-rules規(guī)則引擎流程詳解
這篇文章主要介紹了SpringBoot集成easy-rules規(guī)則引擎流程,合理的使用規(guī)則引擎可以極大的減少代碼復(fù)雜度,提升代碼可維護(hù)性。業(yè)界知名的開源規(guī)則引擎有Drools,功能豐富,但也比較龐大2023-03-03IKAnalyzer結(jié)合Lucene實(shí)現(xiàn)中文分詞(示例講解)
下面小編就為大家?guī)硪黄狪KAnalyzer結(jié)合Lucene實(shí)現(xiàn)中文分詞(示例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10spring的TransactionalEventListener事務(wù)感知源碼解析
這篇文章主要為大家介紹了spring的TransactionalEventListener事務(wù)感知源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09