一、SpEL表达式注入SpringExpressionLanguage(简称SpEL)是一种强大的表达式语言,用于在运行时查询和操作对象图;语法类似于UnifiedEL,但提供了更多功能,特别是方法调用和基本字符串模板函数。SpEL的诞生就是为了给Spring社区提供一种表达语言,可以无缝对接Spring生态中的所有产品,提供一站式的支持。2、SpEL表达式的基本表达式:文字表达式、关系、逻辑和算术运算表达式、字符串链接和截取表达式、三元运算、正则表达式、括号优先表达式;类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义和引用、赋值表达式、自定义函数、对象属性访问和安全导航表达式、对象方法调用、Bean引用;集合相关的表达式:内联List、内联数组、集合、字典访问、列表、字典;其他表达式:模板表达式3、SpEL基础importmaveninpom.xmlor"org.springframework.expression-3.0.5.RELEASE.jar"添加到classpath5.0.8.RELEASEorg.springframeworkspring-表达式${org.springframework.version}依赖>1。SpEL的使用SpEL在计算表达式值的时候一般分为四步,第三步是可选的:首先构造一个解析器,然后解析器解析字符串表达式,在这里构造上下文,然后获取表达式运算后的值根据上下文。ExpressionParserparser=newSpelExpressionParser();Expressionexpression=parser.parseExpression("('Hello'+'freebuf').concat(#end)");EvaluationContextcontext=newStandardEvaluationContext();context.setVariable("end","!");System.out.println(表达式.getValue(上下文));创建解析器:SpEL使用ExpressionParser接口来表示解析器,并提供了SpelExpressionParser的默认实现;解析表达式:使用ExpressionParser的ParseExpression将对应的表达式解析成一个Expression对象。构造上下文:准备变量定义等表达式所需的上下文数据。求值:通过Expression接口的getValue方法根据上下文获取表达式值。二、SpEL主界面1.ExpressionParser界面:表示解析器。默认实现是org.springframework.expression.spel.standard包中的SpelExpressionParser类。使用parseExpression方法将字符串表达式转换为Expression对象。对于ParserContext接口,使用定义字符串表达式是否为模板,以及模板开始和结束字符;publicinterfaceExpressionParser{ExpressionparseExpression(StringexpressionString);ExpressionparseExpression(StringexpressionString,ParserContextcontext);}示例演示:ExpressionParserparser=newSpelExpressionParser();ParserContextparserContext=newParserContext(){@OverridepublicbooleanisTemplate(){returntrue;}@OverridepublicStringgetExpressionPrefix(){;{return"#@OverridepublicStringgetExpressionSuffix(){return"}";}};Stringtemplate="#{'hello'}#{'freebuf!'}";Expressionexpression=parser.parseExpression(template,parserContext);System.out.println(expression.获取值());演示了ParserContext的使用,其中定义了ParserContext的实现:定义表达式是一个模块,表达式前缀为“#{”,后缀为“}”;parseExpression解析时传入的模板必须以“#{”开头,以“}”结尾。默认传入的字符串表达式不是模板形式,比如前面演示的HelloWorld。EvaluationContext接口:表示上下文,默认实现是org.springframework.expression.spel.support包中的StandardEvaluationContext类,使用setRootObject方法设置根对象,使用setVariable方法注册自定义变量,使用registerFunction注册自定义函数等等等等。表达式接口:表示一个表达式对象。默认实现是org.springframework.expression.spel.standard包中的SpelExpression。它提供了获取表达式值的getValue方法和设置对象值的setValue方法。3.SpEL语法——类相关表达式类类型表达式:使用“T(Type)”表示java.lang.Class实例,“Type”必须是全限定类名,“java.lang”包除外,即包下的类不需要指定包名;类类型表达式也可用于访问类静态方法和类静态字段。具体使用方法:ExpressionParserparser=newSpelExpressionParser();//java.lang包类访问Classresult1=parser.parseExpression("T(String)").getValue(Class.class);System.out.println(result1);//其他包类访问Stringexpression2="T(java.lang.Runtime).getRuntime().exec('open/Applications/Calculator.app')";Class