Язык выражений Spring | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Backend-разработчик на PHP
-9%
Разработчик IoT
-13%
PostgreSQL
-8%
Подготовка к сертификации Oracle Java Programmer (OCAJP) Framework Laravel Cloud Solution Architecture Reverse-Engineering. Professional Архитектура и шаблоны проектирования Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Экcпресс-курс «ELK»
-10%
Инфраструктурная платформа на основе Kubernetes
-6%
Administrator Linux.Basic
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Дизайн сетей ЦОД
-13%
PostgreSQL
-8%
Разработчик программных роботов (RPA) на базе UiPath и PIX Reverse-Engineering. Professional Внедрение и работа в DevSecOps Administrator Linux. Advanced Infrastructure as a code in Ansible Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+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 комментариев
Для комментирования необходимо авторизоваться