Предлагаю подискутировать. К сожалению на форуме
javatalks.ru мое сообщение не вызвало интереса, может быть это признак неготовности аудитории к использованию промышленных решений, но так как последние годы в блоге я писал все больше как раз про такие подходы к решению задач, то возможно у моих читателей тема вызовет больше интереса.
Прежде всего отмечу, что
EJB - это часть стандарта Java EE, отвечающая за организацию бизнес-логики и предоставляющая декларативное управление безопасностью, долговременным хранением данных, глобальными транзакциями, распределенными объектами, кластеризацией и подпиской на сообщения. Основная задача данного стандарта: освободить программиста от реализации низкоуровневых вещей.
Основной альтеративой
EJB долгие годы является
Spring Framework, который, однако, ни одну из вышеперечисленных задач не решает самостоятельно. Есть отвевления в проекте
Spring Framework, отвечающие за модульность (
Spring DM), безопасность (
Spring Security), и т.д. но при этом нет реализации
Single Sign-On (SSO), нет менеджера глобальных и распределенных транзакций,
Spring Framework умеет только подключаться к существующим, предоставляемым как правило полноценными серверами приложений. Что касается кластеризации, то она в
Spring Framework как таковая отсутствует, т.е. можно развернуть две копии приложения на каком-нибудь
Tomcat, но за репликацию сессий, если таковые используются, будет отвечать сам контейнер сервлетов, а за вызов обеих копий по протоколу
HTTP - какой-нибудь внешний балансировщик нагрузки, сам фреймворк при этом не причем. При использовании же
EJB мы, во-первых, не привязаны к протоколу
HTTP и внешнему балансировщику нагрузки:
EJB-клиент является сам себе балансировщиком, да к тому же работает по более быстрому протоколу; во-вторых же, обеспечивается прозрачное для клиента восстановление после сбоев: если вы отметили метод сессионного компонента как идемпотентный, то в случае сбоя вызов от клиета (сервлета или
RMI/IIOP-клиента) автоматически будет перенаправлен на экземпляр компонента, расположенный на другом сервере. Клиент тем самым даже не заметит проблемы.
Т.е.
Spring Framework выступает топором в одноименной каше: он очень крут, но для решения задачи нужно сыпануть в варево порцию библиотек, перемешать и молиться, чтобы ничего не сбоило и не конфликтовало друг с другом.
JAR-Hell. Так же носить с собой ворох библиотек в
WEB-INF/lib - удовольствие ниже среднего.
Основными недостатками
EJB считают многословность, трудоемкость для разработчика, большие
XML-дескрипторы и т.д. Но это все давно в прошлом. Начиная с
EJB 3.0, это уже практически новая технология, лаконичная, активно использующая аннотации как средство описания метаданных. Появившиеся в
EJB 3.1 и
Java EE 6 нововведения делают альтернативные средства, такие как
Spring Framework,
Google Guice,
Tapestry IoC и т.д. ненужными. Да, когда-то они решали свою задачу: облегчать программисту доступ к низкоуровневым сервисам, минуя
EJB, но теперь данная задача не актуальна. У нас в сервере приложений из коробки доступны:
IoC-контейнер, менеджер глобальных и распределенных транзакций, декларативные настройки безопасности, огромное количество различных провайдеров безопасности (хранение данных пользователей хоть в
LDAP, хоть в БД, хоть в специализированных решениях, авторизация хоть по паролю, хоть по сертификату, контроль сертификатов, цепочки отзыва,
Single Sign-On (SSO), сквозная по всем приложениям авторизация и аутентификация, когда сервер приложений определяет, имеет ли право пользователь, вошедший по сертификату, писать в очередь
A и читать данные из БД под пользователем
B, гибкая система прав доступа, когда ровно в 18:00 администратор превращается в тыкву и т.д.), полноценная кластеризация, работа с очередями сообщений и внешними информационными системами. И
EJB - самый простой с точки зрения программиста способ воспользоваться данным богатством, при этом ваш код будет по прежнему состоять из старых-добрых
POJO, использовать
JPA или
JDBC и вызываться из любого веб-фреймворка, который вам нравится.
Вот мое мнение о том, зачем нужны
EJB в современном мире разработки корпоративных приложений.
UPD: по мотивам статьи разгорелась интересная
дискуссия.
UPD2: Сделал небольшой бенчмарк:
EJB показывает на 10 - 15% лучшую производительность нежели
Spring Framework.
Понравилось сообщение - подпишитесь на блог