2009-11-22 1 views

ответ

175

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

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

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

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

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

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

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

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

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

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

+7

Отличное объяснение. И +1 для не только ссылки на Google или спецификации ссылок. – cbmeeks

+4

Так приятно вас сказать, особенно учитывая, что ответ 3,5 года. – duffymo

+5

По-моему, «блокировка» слишком сильная фраза для описания Весны. В конце концов, Spring разработала, чтобы склеить все вместе, а не заменять их, вы всегда можете выбрать, с чем хотите интегрироваться. Кроме того, у всех есть блокировки, даже самые простые Apache Commons блокируют нас, но мы все еще используем его каждый день. –

44

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

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

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

EJB-не является совершенным, хотя, по-прежнему отсутствуют некоторые функции (например вливание, не являющиеся управляемые компоненты, такие как простой POJOs).

+1

Образовательный ответ, но мне интересно, почему/когда вам нужно вводить простой POJO вместо инициализации нового? –

+3

Для целей тестирования. – Philip

18

Очки Паскаля действительны. Тем не менее, в пользу Весны.

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

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

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

+0

Возможно, что-то вроде: «Весна нужна только для сервлет-движка * будет более точной (EJB может использоваться в любом контейнере JEE, сервлет-движке! = Контейнер JEE). –

+1

Ну, технически, Spring не требует и сервлет-двигателя. Например, Spring-тест использует контекст в памяти. – Bozho

+3

Ну, технически, EJB не требуют отдельного контейнера, если вы идете этим путем. Начиная с EJB 3.1 существует стандартный API 'EJBContainer.createEJBContainer()' для использования встроенного контейнера. Итак, ваше утверждение неверно. –

-22

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

Главное преимущество использования пружины заключается в том, что между классами нет связи.

+8

вы совершенно не правы, извините –

+2

извините @sasi это даже не близко к правильному или приятному ответу ....... – Prakash

+4

«Весна не существовала бы без EJB». Человек, ты на самом деле? Вы когда-нибудь в своей жизни использовали «\ @Stateless» в объявлении EJB или использовали аннотацию \ @EJB для инъекций? Как вы думаете, они будут работать в Jetty или Tomcat? Как вы думаете, что операции управляются весной? Вы знаете, что вы можете развернуть приложение Spring прямо в контейнер сервлетов? – 99Sono