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

spring之SpEL表達式詳解

 更新時間:2022年02月17日 10:25:13   作者:sunpy 孫培煜  
這篇文章主要介紹了spring之SpEL表達式詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1.什么是SpEL表達式

SpEL表達式語言是一種表達式語言,是一種可以與一個基于spring的應用程序中的運行時對象交互的東西。有點類似于ognl表達式??偟脕碚fSpEL表達式是一種簡化開發(fā)的表達式,通過使用表達式來簡化開發(fā),減少一些邏輯、配置的編寫。

2.SpEL表達式語言入門程序

(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é)果:

解釋:這里使用了表達式#{systemProperties['user.language']}來設置值,用來檢索用戶語言系統(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注解的方式,當實例化MyMessage2這個bean的時候,將使用該注解設置默認值。此處還是使用了之前的SpEL表達式,來設置用戶語言系統(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上下文中所定義的每一個表達式都應該首先被解析,然后在被評估。解析的過程采用了ExpressionParser接口的分析器進行處理的。SpelExpressionParser主要負責將字符串表達式解析到已編譯的Expression對象中。(創(chuàng)建的分析器實例是線程安全)

代碼形式:

ExpressionParser parser =new SpelExpressionParser();

注意:

在SpEL表達式中,默認情況下,表達式前綴為 ' # ' ,而后綴為 ' } ' 。如果表達式中沒有前綴和后綴,那么表達式字符串就被當作純文本。

分析器解析Spel中純文本表達式HelloWorld:

public class HelloWorldTest {
	ExpressionParser parser;
	
	@Before
	public void setup(){
		//初始化創(chuàng)建SpEL表達式解析器
		parser =new SpelExpressionParser();
	}
	
	@Test
	public void test(){
		//使用解析器解析出表達式exp
		Expression exp=parser.parseExpression("'Hello World'");
		//在表達式中獲取指定類型的值
		String value =exp.getValue(String.class);
		assertThat(value ,is("Hello World"));
	}
}

junit測試結(jié)果:

4.使用SpEL表達式調(diào)用方法

(1)使用SpEL調(diào)用普通方法

就是SpEL也支持在表達式中采用方法調(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("當前用戶的用戶名:"+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表達式調(diào)用變量和函數(shù)

(1)#變量的表達式使用

SpEL使用上下文StandardEvaluationContext查找表達式中存在的變量。在表達式中使用變量名稱前添加一個標簽前綴#,使用已注冊的變量。

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表達式的使用

可以在上下文中設置一個對象評估,可以使用#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預定義變量:systemProperties和systemEnvironment

parser.parseExpression("@systemProperties['java.version']").getValue(context);
parser.parseExpression("@systemProperties[JAVA_HOME]").getValue(context);

7.使用SpEL表達式中的運算符

SpEL提供了多種運算符。

類型

運算符

關系

<,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne

算術(shù)

+,- ,* ,/,%,^

邏輯

&&,||,!,and,or,not,between,instanceof

條件

?: (ternary),?: (elvis)

正則表達式

matches

其他類型

?.,?[…],![…],^[…],$[…]

注意:如果解析表達式時,在完全限定的類名中包含一個運算符的文本表示形式,則會產(chǎn)生異常。

正則表達式運算符matches

@Test
	public void test(){
		ExpressionParser parser =new SpelExpressionParser();
		assertThat(parser.parseExpression("35 matches '[0-9]+'").getValue(Boolean.class), is(true));
	}

結(jié)果:

邏輯運算符between

@Test
public void test(){
	ExpressionParser parser =new SpelExpressionParser();
	assertThat(parser.parseExpression("3 between {2,5}").getValue(Boolean.class), is(true));
}

結(jié)果:

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

相關文章

  • Java在Word中插入上標和下標的實現(xiàn)方法

    Java在Word中插入上標和下標的實現(xiàn)方法

    在某些情況下,你可能需要在Microsoft?Word中插入上標和下標。例如,當你正在創(chuàng)建一個涉及科學公式的學術(shù)文件時,在這篇文章中,你將學習如何使用Spire.Doc?for?Java庫在Word文檔中插入上標和下標,需要的朋友可以參考下
    2022-10-10
  • SpringBoot構(gòu)建Restful service完成Get和Post請求

    SpringBoot構(gòu)建Restful service完成Get和Post請求

    這篇文章主要介紹了SpringBoot構(gòu)建Restful service完成Get和Post請求的示例代碼,感興趣的朋友一起看看吧
    2017-08-08
  • SpringBoot集成canal實現(xiàn)示例解析

    SpringBoot集成canal實現(xiàn)示例解析

    這篇文章主要為大家介紹了springboot整合canal的示例實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多進步,早日升職加薪
    2022-02-02
  • Spring Boot 各種回滾操作實戰(zhàn)教程(自動回滾、手動回滾、部分回滾)

    Spring Boot 各種回滾操作實戰(zhàn)教程(自動回滾、手動回滾、部分回滾)

    這篇文章主要介紹了Spring Boot 各種回滾操作實戰(zhàn)教程(自動回滾、手動回滾、部分回滾),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot+devtools實現(xiàn)熱部署的示例代碼

    SpringBoot+devtools實現(xiàn)熱部署的示例代碼

    在軟件項目的開發(fā)過程中,不可避免的會經(jīng)常修改代碼,每次修改代碼,都需要手動停止然后再啟動服務,最后驗證代碼的正確性,今天通過這篇文章,我們一起來學習一下如何使用Spring?Boot?+?devtools?輕松搞定熱部署,需要的朋友可以參考下
    2024-08-08
  • Java http請求封裝工具類代碼實例

    Java http請求封裝工具類代碼實例

    這篇文章主要介紹了Java http請求封裝工具類代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • JavaFX實現(xiàn)簡單日歷效果

    JavaFX實現(xiàn)簡單日歷效果

    這篇文章主要為大家詳細介紹了JavaFX實現(xiàn)簡單日歷效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Spring注解之@Lazy注解使用解析

    Spring注解之@Lazy注解使用解析

    這篇文章主要介紹了Spring注解之@Lazy注解使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • MyBatis Plus構(gòu)建一個簡單的項目的實現(xiàn)

    MyBatis Plus構(gòu)建一個簡單的項目的實現(xiàn)

    這篇文章主要介紹了MyBatis Plus構(gòu)建一個簡單的項目的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Java中字符串截取方法詳解及實際應用小結(jié)

    Java中字符串截取方法詳解及實際應用小結(jié)

    java中截取字符串的常用方法是使用String類的substring方法,本文通過實例代碼給大家介紹Java中字符串截取方法詳解及實際應用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評論

五台县| 长丰县| 阳高县| 香港| 环江| 庆安县| 龙胜| 莱阳市| 汉源县| 林西县| 黎川县| 六安市| 错那县| 平安县| 都昌县| 萍乡市| 北海市| 高雄县| 德保县| 宣武区| 横山县| 前郭尔| 镇远县| 华容县| 古丈县| 鄂州市| 开原市| 牡丹江市| 连南| 永川市| 乐平市| 安康市| 嘉善县| 桃园县| 汉川市| 曲周县| 青州市| 宝应县| 定陶县| 哈尔滨市| 汤原县|