Spring系列.SpEL表示式
阿新 • • 發佈:2020-06-24
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;