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;