Spring系列.SpEL表達式


Spring表達式語言

SpEL語言是一種強大的表達式語言,支持在運行時查詢和操作對象。SpEL表達式不一定要創建IOC容器后才能使用。用戶完全可以單獨調用SpEL的API來獨立的使用時SpEL表達式。SpEL表達式支持如下的特性:

  • 文字表達式;
  • 布爾關系表達式;
  • 正則表達式;
  • 類表達式;
  • 獲取數組和map;
  • 方法調用;
  • 賦值;
  • 應用IOC容器中的Bean;

SpEL簡單例子

    //文字表達式(Literal expressions);
    //需要特別注意的是SpEL整個表達式需要用""括起來,里面的字符串用''括起來
    ExpressionParser parser = new SpelExpressionParser();
	Expression exp = parser.parseExpression("'Hello World'"); 
	String message = (String) exp.getValue();
    
    //調用一個對象的方法(Method invocation)
    ExpressionParser parser = new SpelExpressionParser();
	Expression exp = parser.parseExpression("'Hello World'.concat('!')"); 
	String message = (String) exp.getValue();
       
    ExpressionParser parser = new SpelExpressionParser();
    //如果bytes是一個對象的public屬性,則直接調用這個屬性
    //否則調用對象的getBytes()這個方法
    Expression exp = parser.parseExpression("'Hello World'.bytes"); 
	byte[] bytes = (byte[]) exp.getValue();

    //調用構造函數
    ExpressionParser parser = new SpelExpressionParser();
	Expression exp = parser.parseExpression("new String('hello world').toUpperCase()"); 
	String message = exp.getValue(String.class);

    //獲取一個對象的屬性,注意getValue時,需要將對象作為入參
    // The constructor arguments are name, birthday, and nationality.
    Inventor tesla = new Inventor("Nikola Tesla", c.getTime(), "Serbian");
    ExpressionParser parser = new SpelExpressionParser();
	Expression exp = parser.parseExpression("name"); 
	String name = (String) exp.getValue(tesla);
	// name == "Nikola Tesla"
	exp = parser.parseExpression("name == 'Nikola Tesla'");
	boolean result = exp.getValue(tesla, Boolean.class);
	// result == true

在Bean定義中使用SpEL

    //調用類的靜態方法
	<bean id="numberGuess" class="org.spring.samples.NumberGuess">
	    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
	</bean>

    //調用其他Bean的屬性,其中numberGuess是一個Bean的id,這個Bean有個randomNumber屬性
    <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
	    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
    </bean>

Language Reference

Literal Expressions

將一個字符串定義為表達式

    ExpressionParser parser = new SpelExpressionParser();
	String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
	double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
	// evals to 2147483647
	int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
	boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
	Object nullValue = parser.parseExpression("null").getValue();

Inline Data

    List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue(context);
    List listOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue(context);

	Map inventorInfo = (Map) parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context);
	Map mapOfMaps = (Map) parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context);

參考博客

下面給出一些常用列子

    ExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression("'Hello World'.bytes");
    byte[] bytes = (byte[]) exp.getValue();

    //調用一個類的靜態方法
    @Value("#{T(java.lang.Math).random()}")
    private String randomValue;

    //調用一個Bean的方法
    @Value("#{randomValueGenerator.randValue()}")
    private String randomValue1;

    //調用其他bean的屬性,這個屬性必須是public的
    @Value("#{randomValueGenerator.age}")
    private String value;

    //獲取系統變量的值
    //也可以通過占位符的方式獲取
    @Value("#{systemProperties['user.dir']}")
    private String systemValue;

    @Value("#{systemEnvironment['user.dir']}")
    private String getSystemValue1;
    
    @Value("#{'${arrayConfig}'.split(',')}")
    private String[] array;

    @Value("#{'${intArray}'.split(',')}")
    private int[] intArray;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM