Язык выражений Spring | OTUS
🔥 Начинаем BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Node.js Developer
-25%
Unity Game Developer. Professional
-25%
React.js Developer
-25%
Android Developer. Professional
-25%
Software Architect
-25%
C++ Developer. Professional
-25%
Backend-разработчик на PHP Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Team Lead Разработчик голосовых ассистентов и чат-ботов Архитектура и шаблоны проектирования Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер-практикум по использованию и настройке GIT IoT-разработчик Подготовка к сертификации Oracle Java Programmer (OCAJP) Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «ELK»
-16%
Супер-интенсив «IaC Ansible»
-16%
Administrator Linux. Professional MS SQL Server Developer Безопасность Linux PostgreSQL Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Administrator Linux.Basic Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Язык выражений Spring

Язык выражений Spring (SpEL) — мощный язык, поддерживающий запросы и динамическую манипуляцию графа объекта. О нём и поговорим.

Синтаксис SpEL напоминает Unified EL, однако предоставляет ряд дополнительных возможностей, к коим относится базовая функциональность строковой шаблонизации и вызов методов. Но несмотря на существование OGNL, MVEL и JBoss EL, SpEL создавался, чтобы Spring-сообщество получило единый и хорошо поддерживаемый язык выражений для всех Spring-продуктов. Что в принципе не мешает по мере необходимости применять другие языки выражений, а также использовать SpEL независимо от продуктов Spring.

Инструменты

Главные классы и интерфейсы применения SpEL находятся в пакете org.springframework.expression и соответствующих подпакетах.

Рассмотрим некоторые интерфейсы. Интерфейс ExpressionParser обеспечивает разбор строки выражения. Например, в нижеуказанном коде строковый литерал выражения помещён в одинарные кавычки. А интерфейс Expression обеспечивает вычисление ранее определённой строки выражения.

Screenshot_1-1801-696c52.png

Теперь пару слов о методе getValue. Он способен принимать в качестве аргумента класс, к которому будет обеспечено приведение вычисленного значения выражения. Если же приведение будет невозможным, произойдёт выброс исключения EvaluationException.

В большинстве случаев SpEL применяется в целях вычисления выражения в отношении какого-нибудь объекта, для чего существуют 2 способа получения значения из выражения, применение которых зависит от того, станет ли меняться объект между вызовами вычисления выражения. В случае использования StandardEvaluationContext мы предполагаем, что корневой объект не изменится, ведь сборка StandardEvaluationContext при многократном применении — операция относительно дорогостоящая:

Screenshot_2-1801-c94010.png

Идём далее. Интерфейс EvaluationContext применяется во время вычисления значения выражений из методов, свойств и полей, помогая преобразовывать типы. Spring предоставляет реализацию StandardEvaluationContext, использующую рефлексию в целях манипуляции объекта путём кеширования экземпляров java.lang.reflect.Method/Field/Constructor, что обеспечивает увеличение производительности.

Посредством метода setRootObject() обеспечивается указание корневого объекта, к которому станут применяться выражения, а в методы setVariable() и registerFunction(), соответственно, передаются переменные и функции, которые станут применяться в самом выражении. При регистрации собственных MethodResolver, ConstructorResolver и PropertyAccessor пользователь сможет расширить функционал SpEL для вычисления выражений.

Чтобы настроить возможность разбора выражений, применяют SpelParserConfiguration. При этом объект конфигурации обеспечивает контроль поведения ряда компонентов выражения.

Screenshot_3-1801-d02d47.png

Использование выражений, как правило, подразумевает повышенную гибкость в процессе вычисления значений, но эта гибкость становится возможной в ущерб производительности. Для увеличения производительности применяется компилятор выражений. Компилятор генерирует настоящий Java-класс, что называется, на лету, а его поведение соответствует вычисляемому выражению. Так как само выражение не является типизированным, компилятор берёт во внимание результаты интерпретации и компиляции выражения.

Для примера возьмём выражение someArray[0].someProperty.someOtherProperty < 0.1, предполагающее доступ к элементу массива, числовой операции и разыменованию свойства. Здесь показатели производительности могут значительно различаться. На примере этого выражения можно сказать, что 5 тысяч итераций вычисления без компилятора может составить порядка 75 мс, если же с компилятором — 3 мс.

По дефолту компилятор не включен. Чтобы его включить, есть 2 варианта: — аргументом в конструкторе SpelParserConfiguration; — через системное свойство spring.expression.compiler.mode.

Тут стоит упомянуть три режима компиляции выражений: • OFF — компилятор отключен (этот режим обеспечивается по дефолту); • MEDIATE — компиляция происходит максимально быстро, как правило, после первой интерпретации; • MIXED — в первую очередь выражение вычисляется интерпретатором, однако после некоторого числа вычислений осуществляется переключение на режим компиляции, где выражение компилируется.

Возможности SpEL

На сегодняшний день SpEL поддерживает следующую функциональность:

Screenshot_4-1801-23ea0b.png

По материалам сайта https://spring-projects.ru/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!