EJB 3.1 или Spring 3. Когда что выбрать?

EJB получил много улучшений в версиях 3.x, Spring также широко используется, а версия 3 является хорошей альтернативой.

В Интернете есть много статей, но нет точного сравнения ejb3x и spring3x. Есть ли у вас какие-либо идеи о них, в реальных примерах, какой из них лучше и в каких условиях?

Например, мы хотим разделить базу данных и сервер, что означает, что наше приложение будет на сервере, наша база данных будет на другом сервере. Удаленное взаимодействие EJB против Cluster4Spring и т. д.?

Делать все @Annotation всегда хорошо? конфигурация никогда не нужна?


person asyard    schedule 16.08.2011    source источник
comment
возможный дубликат EJB3 или Spring3 + hibernate, который подходит   -  person duffymo    schedule 16.08.2011


Ответы (7)


Для вашего варианта использования, когда приложение работает на одном сервере, а база данных — на другом, выбор между EJB и Spring не имеет значения. Каждая платформа поддерживает это, будь то приложение Java SE, простой контейнер сервлетов, такой как Tomcat или Jetty, PHP, Ruby on Rails или что-то еще.

Для этого вам не нужно никакого явного удаленного взаимодействия. Вы просто определяете источник данных, предоставляете URL-адрес, где находится ваш сервер БД, и все.

Тем не менее, и EJB, и Spring Beans упрощают работу с источниками данных. Они оба помогают вам определить источник данных, внедрить его в bean-компоненты и управлять связанными с ними транзакциями.

Из этих двух компонентов EJB (и Java EE в целом) является более легким и в большей степени придерживается принципа соглашения по сравнению с конфигурацией. Spring требует большей детализации, чтобы получить то же самое, и во многом зависит от XML-файлов, которые могут быстро стать очень большими и громоздкими. Обратная сторона медали заключается в том, что Spring может быть менее волшебным, и вы можете чувствовать себя более уверенно после того, как пропишете все, что хотите.

Другая проблема заключается в том, как разрабатываются EJB и Spring.

EJB бесплатен (как и бесплатное пиво), с открытым исходным кодом и не является собственностью. Существуют реализации EJB, созданные некоммерческими организациями (Apache), компаниями с открытым исходным кодом (Redhat/JBoss) и коммерческими предприятиями с закрытым исходным кодом (IBM). Лично я бы избегал последнего, но каждому свое.

Spring, с другой стороны, является бесплатным и открытым исходным кодом, но строго проприетарным. Существует только одна компания, производящая Spring, и это Springsource. Если вы не согласны с Родом, то вам не повезло. Это не обязательно плохо, но разница, о которой вы, возможно, захотите знать.

Делать все @Annotation всегда хорошо? конфигурация никогда не нужна?

Это бесконечный спор на самом деле. Некоторые утверждают, что XML трудно поддерживать, другие утверждают, что аннотации загрязняют в остальном чистую модель POJO.

Я думаю, что аннотирование bean-компонента как bean-компонента EJB без состояния (@Stateless) или объекта JPA (@Entity) более четко выполняется с использованием аннотаций. То же самое касается инъекций зависимостей @EJB или @Inject. С другой стороны, я предпочитаю, чтобы именованные запросы JPQL находились в XML-файлах, а не в аннотациях, а инъекции, представляющие чистые данные конфигурации (например, максимальное значение для чего-либо), также были в XML.

В Java EE каждая аннотация также может быть указана в XML. Если присутствуют и аннотация, и XML-эквивалент, XML имеет приоритет над аннотацией. Это делает очень удобным начать с аннотации для случая по умолчанию, но позже переопределить ее через XML для конкретного варианта использования.

Текущие предпочтения в Java EE, похоже, больше связаны с (простыми) аннотациями в сочетании с большим количеством соглашений по сравнению с конфигурацией.

person akira    schedule 17.08.2011
comment
Акира, спасибо за подробный ответ, я немного запутался в удалении. когда они нужны? в ситуациях, когда требуется удаленное взаимодействие, есть ли у Spring возможности, которые EJB может делать с @remote bean-компонентами? - Могу задать в другом вопросе, если хотите.. - person asyard; 18.08.2011

Настоящий вопрос, который вы должны задать, это CDI/EJB или Spring.

person David Blevins    schedule 27.08.2011

Часто это не Spring против EJB, а Spring против Java EE. Сам EJB сравнивается со Spring Beans. Оба они являются своего рода управляемыми bean-компонентами, работающими внутри контейнера (контейнер EJB или контейнер Spring).

В целом эти две технологии довольно похожи. Реза Рахман провел отличное сравнение между ними некоторое время назад.

person Mike Braun    schedule 17.08.2011
comment
Будучи почти год назад, я не могу точно вспомнить, на какой именно я ссылался, но это действительно было что-то вроде этого. - person Mike Braun; 17.07.2012
comment
Документ датирован 2007 годом. Я уверен, что многое изменилось, особенно в Java 6 EE. - person T3rm1; 30.08.2012
comment
В Java EE 6 появился CDI, так что это действительно серьезное изменение. EJB изменился менее резко с версии 3.0 на версию 3.1, поэтому большая часть сравнения все еще может быть верной. Локальное представление (без обязательного бизнес-интерфейса) и возможность находиться где угодно (вместо специального модуля EJB) были наиболее важными изменениями для этого сравнения. - person Mike Braun; 30.08.2012

EJB более выгодны из-за стандартизации. Если вы работаете с легким приложением, я думаю, что использование Spring — это нормально, но если вы ожидаете, что ваше приложение будет большим и потребует большого доступа к памяти и доступа к данным, вы можете подумать о том, чтобы начать разработку с EJB. Основная причина заключается в том, что кластеризация и балансировка нагрузки встроены в структуру EJB.

В среде EJB, когда развернут EAR ('E'enterprise' AR'chive), он может быть развернут с несколькими bean-компонентами EJB, каждый из которых может иметь определенную цель. Допустим, вы написали компонент для управления пользователями и другой компонент для управления продуктом. Возможно, однажды вы обнаружите, что ваши пользовательские сервисы намного превосходят сервисы доступа к вашим продуктам, и вы захотите переместить свой пользовательский компонент на другой сервер на другом компьютере. На самом деле это можно сделать во время выполнения без изменения кода. Bean-компоненты можно перемещать между серверами и базами данных, чтобы обеспечить кластеризацию и балансировку нагрузки/данных, не затрагивая ваших разработчиков или пользователей, поскольку большую часть этого можно настроить на уровне развертывания.

Еще одна причина для поддержки стандарта заключается в том, что он знает, что большинство крупных сторонних поставщиков, скорее всего, поддержат его, что приведет к меньшему количеству проблем при интеграции с новым стандартом/услугой/технологией – и давайте смотреть правде в глаза, они появляются как новые вкусы мороженого. И если он находится в публичной спецификации, новые стартапы или добрые разработчики могут создать версию с открытым исходным кодом.

http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html

Очень жаль, что даже самые умные дизайнеры или программисты не могут предсказать, какие из их функций могут или не могут быть приняты сообществом разработчиков, что является основной причиной раздувания программного обеспечения ... Java EE определенно это!

person YP Leung    schedule 12.11.2013

Выберите одно или другое, но не оба.

Лично я предпочитаю Весну. Я использовал в проектах с большим успехом в течение последних шести лет. Это так же надежно, как любое программное обеспечение.

Spring может работать с EJB, если вы решите использовать их в своем приложении, но я не думаю, что верно обратное.

Я бы рекомендовал отдельные физические машины для веб-серверов, серверов приложений и баз данных, если вы можете себе это позволить.

Spring может работать с несколькими вариантами удаленного взаимодействия, включая веб-службы SOAP и REST. Сравнение компонентов Spring с EJB выходит за рамки этого вопроса. Я не понимаю, какое это имеет отношение к вашей реализации. Если вы используете службы Spring POJO, они находятся в памяти, а не требуют другого сетевого перехода, такого как удаленные EJB. Вспомните закон Фаулера о распределенных объектах: «Не делайте этого». Вводите задержку только по уважительной причине.

person duffymo    schedule 16.08.2011
comment
привет, duffymo, спасибо за ваш быстрый ответ. у вас есть идея о разделении приложений/веб-серверов и базы данных? Мы должны сделать такую ​​​​реализацию, поэтому есть ли у Spring варианты (я думаю, у Spring есть решение RMI) по сравнению с удаленными компонентами EJB? - person asyard; 16.08.2011
comment
Конечно, поместите базу данных на отдельный сервер, а код Java на сервере приложений создайте соединение JDBC. Вам не нужны RMI или удаленные bean-компоненты. POJO могут это сделать. - person duffymo; 03.02.2012

EJB 3.1 является лучшим, хотя и является стандартом для приложений Java 6 EE.

Spring по-прежнему не поддерживает Java 6 CDI (сварка), а также во многом зависит от конфигурации XML. EJB 3.1 мощный и умный.

Я думаю, что Spring 3.1 не нуждается в настройке XML. У вас есть возможность использовать аннотации для конфигурации.

person Armen    schedule 16.04.2012

Я бы упомянул модульное тестирование здесь. В обычном веб-приложении (контроллер->сервис->данные->...->представление) EJB и Spring обеспечивают одинаковый результат, но Spring предлагает более простое тестирование.

По моему скромному опыту, то, как вы развиваетесь, отличается в нескольких аспектах:

person Lauri    schedule 05.08.2015