Spring 核心特性之表達式(SpEL)_spring spel-CSDN博客?-- 寫的還行
關于SpEL的幾個概念:
- 表達式(“干什么”):SpEL的核心,所以表達式語言都是圍繞表達式進行的。
- 解析器(“誰來干”):用于將字符串表達式解析為表達式對象。
- 上下文(“在哪干”):表達式對象執行的環境,該環境可能定義變量、定義自定義函數、提供類型轉換等等。
- root根對象及活動上下文對象(“對誰干”):root根對象是默認的活動上下文對象,活動上下文對象表示了當前表達式操作的對象。
可以使用?#variableName
?的形式引用變量,變量在?EvaluationContext#setVariable
?上進行設置,變量名只能包含字母?A
到Z
,a
?到z
、數字?0
?到?9
、下劃線?_
?以及美元符號?$
。變量使用示例如下。?
//調用對象屬性值 public static void main(String[] args) {// Create and set a calendarGregorianCalendar c = new GregorianCalendar();c.set(1856, 7, 9);//構造一個對象, The constructor arguments are name, birthday, and nationality.Inventor tesla = new Inventor("Nikola Tesla", c.getTime(), "Serbian");ExpressionParser parser = new SpelExpressionParser();//對應方法: Object getValue(@Nullable Object rootObject)Expression exp = parser.parseExpression("name"); // Parse name as an expressionString name = (String) exp.getValue(tesla);System.out.println(name);// name == "Nikola Tesla"exp = parser.parseExpression("name == 'Nikola Tesla'");boolean result = exp.getValue(tesla, Boolean.class);System.out.println(result);// result == true}
//設置全局參數, 參數取值 public static void main(String[] args) {ExpressionParser parser = new SpelExpressionParser();//#end 變量取值Expression expression = parser.parseExpression("('Hello' + ' World').concat(#end)");EvaluationContext context = new StandardEvaluationContext();context.setVariable("end", "!");System.out.println(expression.getValue(context));}
#被調用方法 public class CustomFunctions {public static boolean isMember(String name) {// 在這里編寫檢查是否為會員的邏輯,這里只是一個示例if (name.equals("Mihajlo Pupin")) {return true;} else {return false;}} }//spel表達式中, 調用方法參數 public static void main(String[] args) { // 方式1: // StandardEvaluationContext context = new StandardEvaluationContext(); // context.registerFunction("isMember", CustomFunctions.class.getDeclaredMethod("isMember", String.class)); //注冊自定義函數// 方式2:EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();context.setVariable("isMember", CustomFunctions.class.getDeclaredMethod("isMember", String.class));//通過變量方式執行方法SpelExpressionParser parser = new SpelExpressionParser();boolean isMember = parser.parseExpression("#isMember('Mihajlo Pupin1')").getValue(context, Boolean.class);System.out.println(isMember);}// 調用Bean 中的方法 public static void main(String[] args) {/*** 調用Bean 中的方法* 如果解析上下文已經配置,那么bean解析器能夠 從表達式使用(@)符號查找bean類。*/// 1.創建表達式解析器ExpressionParser parser = new SpelExpressionParser();// 2.創建變量上下文,設置變量StandardEvaluationContext ctx = new StandardEvaluationContext();// 此處用DefaultListableBeanFactory做測試,系統運行時可傳入ApplicationContextDefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();beanFactory.registerSingleton("user", new CustomFunctions("成龍"));ctx.setBeanResolver(new BeanFactoryResolver(beanFactory));// 3. spel解析器執行表達式取得結果System.out.println(parser.parseExpression("@user.getName()").getValue(ctx, String.class)); }