表达式模板
表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都由前缀和后缀字符分隔,默认是#{}。支持实现接口ParserContext自定义前后缀。调用parseExpression()时指定 ParserContext参数如:new TemplateParserContext(),#{}包起来的表达式会被计算
@Test
public void test23 () {
    //the year is 2014
    String expressionStr = "the year is #{T(java.util.Calendar).getInstance().get(T(java.util.Calendar).YEAR)}";
    ExpressionParser parser = new SpelExpressionParser();
    Expression expression = parser.parseExpression(expressionStr, new TemplateParserContext());
    System.out.println(expression.getValue());
}
使用场景
当我们不想计算整个表达式的信息,只想要计算某个对应的表达式信息时可以使用表达式模板
@Test
public void test01() {
    ExpressionParser parser = new SpelExpressionParser();
    System.out.println(parser.parseExpression("'hello is 1+1'").getValue());
    // hello is 1+1
    ParserContext templateExpression = ParserContext.TEMPLATE_EXPRESSION;
    System.out.println(parser.parseExpression("hello is #{1+1}", templateExpression).getValue());
    // hello is 2
}
自定义模板
@Test
public void test02() {
    ExpressionParser parser = new SpelExpressionParser();
    ParserContext templateExpression = new ParserContext() {
        // 是否启用模板
        @Override
        public boolean isTemplate() {
            return true;
        }
        // 前缀
        @Override
        public String getExpressionPrefix() {
            return "%{";
        }
        // 后缀
        @Override
        public String getExpressionSuffix() {
            return "}";
        }
    };
    System.out.println(parser.parseExpression("hello is #{1+1}", templateExpression).getValue());
    System.out.println(parser.parseExpression("hello is %{1+1}", templateExpression).getValue());
}
ParserContext接口(解析上下文)
ParserContext接口代表提供给表达式解析器的输入,可以影响表达式解析和编译
public interface ParserContext {
   // 是否启用模板
   boolean isTemplate();
   // 模板表达式的前缀
   String getExpressionPrefix();
   //  模板表达式的后缀
   String getExpressionSuffix();
   // 启用模板表达式解析模式的默认 ParserContext 实现。表达式前缀是“#{”,表达式后缀是“}”。
   ParserContext TEMPLATE_EXPRESSION = new ParserContext() {
      @Override
      public boolean isTemplate() {
         return true;
      }
      @Override
      public String getExpressionPrefix() {
         return "#{";
      }
      @Override
      public String getExpressionSuffix() {
         return "}";
      }
   };
}

TemplateParserContext
可以自定义模板的信息
public class TemplateParserContext implements ParserContext {
    private final String expressionPrefix;
    private final String expressionSuffix;
    public TemplateParserContext() {
        this("#{", "}");
    }
    public TemplateParserContext(String expressionPrefix, String expressionSuffix) {
        this.expressionPrefix = expressionPrefix;
        this.expressionSuffix = expressionSuffix;
    }
    public final boolean isTemplate() {
        return true;
    }
    public final String getExpressionPrefix() {
        return this.expressionPrefix;
    }
    public final String getExpressionSuffix() {
        return this.expressionSuffix;
    }
}



















