1. 程式人生 > 實用技巧 >Spring系列.SpEL表示式

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;