Весна против EJB. Может ли Spring заменить EJB? [закрыто]

96

Поскольку Spring может использовать транзакции точно так же, как EJB . Для меня Spring может заменить требование использования EJB. Может ли кто-нибудь сказать мне, каковы дополнительные преимущества использования EJB?

комета
источник

Ответы:

201

Spring был разработан как альтернатива EJB с самого начала, поэтому ответ, конечно, можно использовать вместо EJB.

Если есть «преимущество» в использовании EJB, я бы сказал, что это будет зависеть от навыков вашей команды. Если у вас нет опыта в Spring и большой опыт работы с EJB, то, возможно, придерживаться EJB 3.0 - хороший шаг.

Серверы приложений, написанные для поддержки стандарта EJB, теоретически могут быть перенесены с одного совместимого сервера приложений Java EE на другой. Но это означает, что нужно держаться подальше от любых расширений для конкретных поставщиков, которые привязывают вас к одному поставщику.

Spring легко переносится между серверами приложений (например, WebLogic, Tomcat, JBOSS и т. Д.), Поскольку не зависит от них.

Однако вы заперты в Spring.

Spring поощряет хорошие методы объектно-ориентированного проектирования (например, интерфейсы, уровни, разделение задач), которые приносят пользу любой проблеме, с которой они сталкиваются, даже если вы решите переключиться на Guice или другую структуру DI.

Обновление: этому вопросу и ответу пять лет в 2014 году. Надо сказать, что мир программирования и разработки приложений сильно изменился за это время.

Это больше не просто выбор между Java или C #, Spring или EJB. С vert.x можно вообще отказаться от Java EE. Вы можете писать высокомасштабируемые многоязычные приложения без сервера приложений.

Обновление: сейчас март 2016 года. Spring Boot предлагает еще лучший способ писать приложения без серверов приложений Java EE. Вы можете создать исполняемый JAR-файл и запустить его на JVM.

Интересно, продолжит ли Oracle поддерживать спецификацию Java EE. Веб-сервисы пришли на смену EJB. Решение EJB мертво. (Только мое мнение.)

Duffymo
источник
7
На мой взгляд, «запереть» - слишком сильное словосочетание, чтобы описать весну. В конце концов, Spring спроектирован так, чтобы склеивать все вместе, а не заменять их, вы всегда можете выбрать то, с чем хотите интегрироваться. Кроме того, у всего есть блокировки, даже самый простой Apache Commons блокирует нас, но мы все еще используем его каждый день.
Кристофер Ян
3
У VMWare / Spring нет альтернативных поставщиков, так как вы можете выбирать между Oracle, Red Hat и IBM для платформ Java EE. Это все, что я имел в виду. Это не комментарий относительно возможностей или полезности Spring. Мне это очень нравится. Пользуюсь им каждый день, а ночью сплю.
duffymo 06
1
@ChristopherYang, это правильно. Я имею в виду, что «Java» будет блокировкой производителя. В конце концов, нам просто нужно перестать спорить и что-то сделать. :-)
cbmeeks
4
Этому вопросу почти пять лет. Лично я считаю, что EJB-компоненты - устаревшая технология, которая во всех отношениях проиграла веб-службам HTTP. Простой и открытый выигрыш. Предоставьте мне услуги REST, и вы сможете сохранить свои EJB-компоненты. Весна их прекрасно поддерживает. Вот куда ушел мир.
duffymo
1
Спасибо за ответ. Просто ищу преимущества, оценивая лучшее (SPRING, EJB 3.x) для миграции с существующего приложения EJB 2.1. Еще один вопрос, EJB 3.x также поддерживает WebService. Итак, можем ли мы получить преимущества JNDI / RMI для распространения приложений Java и WS для других приложений?
noboundaries
48

Во-первых, позвольте мне четко сказать, я не говорю, что вам не следует использовать Spring, но, поскольку вы просите о некоторых преимуществах, вот как минимум два из них:

  • EJB 3 является стандартом, а Spring - нет (это стандарт де-факто, но это не одно и то же), и это не изменится в обозримом будущем. Хотя вы можете использовать среду Spring с любым сервером приложений, приложения Spring заблокированы как в самой Spring, так и в конкретных службах, которые вы выбираете для интеграции в Spring.

  • Фреймворк Spring находится поверх серверов приложений и сервисных библиотек. Код интеграции службы (например, шаблоны доступа к данным) находится в структуре и доступен разработчикам приложений. В отличие от этого, структура EJB 3 интегрирована в сервер приложений, а код интеграции сервисов инкапсулируется за интерфейсом. Таким образом, поставщики EJB 3 могут оптимизировать производительность и удобство разработки, работая на уровне сервера приложений. Например, они могут тесно связать механизм JPA с управлением транзакциями JTA. Другой пример - поддержка кластеризации, которая прозрачна для разработчиков EJB 3.

EJB 3 не идеален, в нем все еще отсутствуют некоторые функции (например, внедрение неуправляемых компонентов, таких как простые POJO).

Паскаль Тивент
источник
1
Образовательный ответ, но мне интересно, почему / когда вам нужно вводить простой POJO вместо инициализации нового?
Ömer Faruk Almalı
4
Для тестирования.
Филипп
22

Очки Паскаля действительны. Однако в пользу Spring есть следующие аргументы.

  • Спецификация EJB на самом деле немного расплывчата, поэтому на разных серверах приложений можно наблюдать разное поведение. Конечно, в большинстве случаев это не так, но у меня была такая проблема с некоторыми «темными углами».

  • Spring имеет много дополнительных плюсов, таких как Spring-test, AOP, MVC, интеграция JSF и т. Д. EJB имеет некоторые из них (например, перехватчики), но, на мой взгляд, они не так уж и разработаны.

В заключение, это в основном зависит от вашего конкретного случая.

Божо
источник
Возможно, что-то вроде Spring нуждается только в движке сервлетов, было бы более точным (EJB можно использовать в любом контейнере JEE, движок сервлетов! = Контейнер JEE).
Паскаль Тивент,
1
Что ж, технически Spring также не требует движка сервлетов. Например, Spring-Test использует контекст в памяти.
Bozho
3
Что ж, технически EJB не требуют отдельного контейнера, если вы пойдете этим путем. Начиная с EJB 3.1 существует стандартный EJBContainer.createEJBContainer()API для использования встроенного контейнера. Так что все же ваше утверждение неверно.
Паскаль Тивент,
Хорошо, 3.1 довольно новая и, очевидно, я забыл о дополнениях. Убрал этот пункт из моего ответа.
Bozho
-30

Spring предназначен для дополнения EJB, а не для его замены. Spring - это слой поверх EJB. Как мы знаем, кодирование EJB выполняется с использованием API, что означает, что мы должны реализовать все в API, используя среду Spring. Мы можем создать шаблонный код, затем просто взять эту табличку, добавить к ней что-нибудь, и все будет готово. Внутренне Spring связан с EJB - Spring не существовал бы без EJB.

Основное преимущество использования Spring в том, что между классами нет никакой связи.

саси
источник
8
Вы совершенно не правы, извините
Jakub H
2
извините @sasi, это даже близко не к правильному или красивому ответу .......
Prakash
4
«Spring не было бы без EJB». Человек, ты на самом деле? Вы когда-нибудь в жизни использовали "\ @Stateless" в объявлении EJB или использовали аннотацию \ @EJB для внедрения? Как вы думаете, они будут работать в Jetty или Tomcat? Как вы думаете, как управляются транзакции весной? Вы знаете, что вы можете развернуть приложение Spring в контейнере сервлетов, верно?
99Sono
Извините, но у вас нет хорошо структурированного понимания обоих: EJB как части Java EE и Spring как принципа соглашения над конфигурацией. На самом деле, если вы не копаете глубоко, вы можете в конечном итоге подумать, что это что-то одно и то же, или что-то вроде родства. Зачем? они оба имеют сходство, как инъекция, но разница между ними огромна. Это правда, что Spring родился как альтернатива EJB из-за сложности EJB, но так оно и было. Достаточно хорошо во время Java EE 5 (EJB 3) был отретуширован, как и
Spring