SpEL對表達式語法解析過程進行了很高的抽象,抽象出解析器、表達式、解析上下文、估值(Evaluate)上下文等對象,非常優雅的表達了解析邏輯。主要的對象如下:
類名 |
說明 |
ExpressionParser |
表達式解析器接口,包含了(Expression) parseExpression(String), (Expression) parseExpression(String, ParserContext)兩個接口方法 |
ParserContext |
解析器上下文接口,主要是對解析器Token的抽象類,包含3個方法:getExpressionPrefix,getExpressionSuffix和isTemplate,就是表示表達式從什么符號開始什么符號結束,是否是作為模板(包含字面量和表達式)解析。一般保持默認。 |
Expression |
表達式的抽象,是經過解析后的字符串表達式的形式表示。通過expressionInstance.getValue方法,可以獲取表示式的值。也可以通過調用getValue(EvaluationContext),從評估(evaluation)上下文中獲取表達式對於當前上下文的值 |
EvaluationContext |
估值上下文接口,只有一個setter方法:setVariable(String, Object),通過調用該方法,可以為evaluation提供上下文變量 |
public static void main(String[] args) { //測試SpringEL解析器 String template = "#{#user},早上好";//設置文字模板,其中#{}表示表達式的起止,#user是表達式字符串,表示引用一個變量。 ExpressionParser paser = new SpelExpressionParser();//創建表達式解析器 //通過evaluationContext.setVariable可以在上下文中設定變量。 EvaluationContext context = new StandardEvaluationContext(); context.setVariable("user","黎明"); //解析表達式,如果表達式是一個模板表達式,需要為解析傳入模板解析器上下文。 Expression expression = paser.parseExpression(template,new TemplateParserContext()); //使用Expression.getValue()獲取表達式的值,這里傳入了Evalution上下文,第二個參數是類型參數,表示返回值的類型。 System.out.println(expression.getValue(context,String.class)); }
輸出結果: