Spring Expression Language (сокращенно SpEL) — это мощный язык выражений, который поддерживает запросы и манипулирование графом объектов во время выполнения, а также оценку логических и математических выражений и многие другие функции. Посмотрите на страницу SpEL для списка этих. SpEL может использоваться независимо, независимо от того, использует ли ваша среда приложения Spring или нет.
В этом посте мы будем использовать SpEL для ряда вариантов использования, чтобы изучить возможности этой библиотеки. Мы будем освещать следующие темы.
- Получение SpEL
 - Оценка буквальных выражений
 - Выполнение вызова метода на литералах
 - Доступ к свойствам и методам объекта
 - операторы
 - Использование нескольких объектов и переменных
 - функции
 
Получение SpEL
Если вы используете maven, добавьте следующую зависимость в ваш файл pom.
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>4.0.0.RELEASE</version>
</dependency>
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-expression</artifactId>
     <version>3.1.0.RELEASE</version>
</dependency>
В противном случае вы можете скачать банку отсюда и добавить ее в свой путь к классам.
Прежде чем вызывать любую из функций ниже, инициализируйте атрибут синтаксического анализатора SpelExpression уровня класса следующим образом
public class Main {
    private ExpressionParser parser;
    public Main(){
        this.parser = new SpelExpressionParser();        
    }...
Оценка буквальных выражений
SpEL может отображать литеральные значения в их правильном типе.
/**
* A function that tests literal expressions.
*/private void evaluateLiteralExpresssions() {//A string literal
      Expression exp = parser.parseExpression("'Hello World'");
      String message = (String) exp.getValue();
      System.out.println(message);//An integer literal
      exp = parser.parseExpression("6");
      Integer value = exp.getValue(Integer.class);
      System.out.println(value*2);
}
Выполнение вызова метода на литералах
SpEL может использоваться для выполнения методов над литералами. Например, вызовите метод substring для строки.
/**
* A function that tests method invocation on literals
*/private void methodInvocationOnLiterals() {
      Expression exp = parser.parseExpression("'Hello World'.concat('!')");
      String message = (String) exp.getValue();
      System.out.println(message);
      exp = parser.parseExpression("'Hello World'.length()");
     Integer size = exp.getValue(Integer.class); 
      System.out.println(size); 
       exp = parser.parseExpression("'Hello World'.split(' ')[0]"); 
       message = (String)exp.getValue(); System.out.println(message);
}
Доступ к свойствам и методам объекта
Выражение может напрямую использовать значения определенного свойства класса (просто используя имя свойства). Аналогично, функцию можно вызывать в выражении (используя functionName ())
/**A function that tests accessing properties of objects**/
private void accessingObjectProperties() {
User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
Expression exp = parser.parseExpression("firstName");
System.out.println((String)exp.getValue(user));
exp = parser.parseExpression("isAdmin()==false");
boolean isAdmin = exp.getValue(user, Boolean.class);
System.out.println(isAdmin);        
exp = parser.parseExpression("emailAddress.split('@')[0]");<
String emailId = exp.getValue(user, String.class);
System.out.println(emailId);}
операторы
SpEL поддерживает следующие математические, логические и реляционные операторы.
Операторы отношений: ==,! =, <, <=,>,> =
Логические операторы: и, или, не
Математические операторы: +, -, /, *,%, ^
private void operators() {
     User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
     Expression exp = parser.parseExpression("age > 18");
     System.out.println(exp.getValue(user,Boolean.class));
     exp = parser.parseExpression("age < 18 and isAdmin()");
     System.out.println(exp.getValue(user,Boolean.class));
}
Использование нескольких объектов и переменных
Выражение должно ссылаться не только на один объект, так как мы можем использовать несколько объектов разных типов в выражении. Вы добавляете все объекты, которые хотите использовать в контексте, в качестве пар ключ-значение, а затем ссылаетесь на объект в выражении.
private void variables() {
      User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
      Application app = new Application("Facebook", false);        
      StandardEvaluationContext context = new StandardEvaluationContext();
      context.setVariable("user", user);
      context.setVariable("app", app);        
      Expression exp = parser.parseExpression("#user.isAdmin() and #app.isActive()");
      boolean result = exp.getValue(context,Boolean.class);
      System.out.print(result);
}
функции
В SpEL вы можете определять свои собственные функции и вызывать их из своего выражения.
private void customFunctions() {    
        try {
StandardEvaluationContext context = new StandardEvaluationContext();context.registerFunction("isURLValid", Function.class              .getDeclaredMethod("isValid", new Class[] { String.class }));String expression = "#isURLValid('http://google.com')";
boolean isURLValid = parser.parseExpression(expression).getValue(context,Boolean.class);System.out.println(isURLValid);        } catch (Exception e) {    System.out.println(e);       } }