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", "[email protected]", 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", "[email protected]", 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", "[email protected]", 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); } }