EJB 3.1 или Spring 3. Когда выбрать какой? - PullRequest
41 голосов
/ 16 августа 2011

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

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

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

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

Ответы [ 7 ]

56 голосов
/ 17 августа 2011

Для вашего случая использования, когда приложение работает на одном сервере, а база данных работает на другом, выбор между 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.Если вы не согласны с Родом, тогда вам не повезло.Это не обязательно плохо, но есть разница, о которой вы могли бы знать.

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

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

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

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

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

14 голосов
/ 28 августа 2011

Реальный вопрос, который вы должны задать: CDI / EJB или Spring

6 голосов
/ 12 ноября 2013

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

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

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

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

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

6 голосов
/ 17 августа 2011

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

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

3 голосов
/ 16 августа 2011

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

Мое личное предпочтение - весна. Я использовал проекты с большим успехом в течение последних шести лет. Он такой же твердый, как и любое программное обеспечение.

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

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

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

2 голосов
/ 05 августа 2015

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

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

  • Юнит тест (весна выигрывает). Весной это сделано довольно прямо вперед, в то время как в ejb вы должны использовать Arqullian с ShrinkWrap (sic!), Который медленно запускается при каждой сборке.
  • Постоянство (ejb побед). Весной происходит борьба вокруг этого, т. Е. Google "Как автоматически сохранить постоянство в слушателе сущностей" http://bit.ly/1P6u5WO
  • Конфигурация (выигрывает ejb). Как новичок, пришедший весной из ejb, я был удивлен роем аннотаций и файлов .xml.
2 голосов
/ 16 апреля 2012

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

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

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

...