Весна против EJB. Может ли Spring заменить EJB?
4 ответа
Spring был разработан как альтернатива EJB с самого начала, так что ответ, конечно, вы можете использовать Spring вместо 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. Вы можете писать масштабируемые приложения Polyglot без сервера приложений.
Обновление: сейчас март 2016 Spring Boot предлагает еще лучший способ написания приложений без серверов приложений Java EE. Вы можете создать исполняемый файл JAR и запустить его на JVM.
Интересно, продолжит ли Oracle поддерживать спецификацию Java EE. Веб-сервисы перешли на EJB. Решение EJB мертво. (Просто мое мнение.)
Во-первых, позвольте мне сказать это ясно, я не говорю, что вы не должны использовать Spring, но, поскольку вы запрашиваете некоторые преимущества, вот как минимум два из них:
EJB 3 - это стандарт, а Spring - нет (это де-факто стандарт, но это не одно и то же), и это не изменится в обозримом будущем. Хотя вы можете использовать среду Spring с любым сервером приложений, приложения Spring заблокированы как в самой Spring, так и в конкретных службах, которые вы выбираете для интеграции в Spring.
Среда Spring находится поверх серверов приложений и сервисных библиотек. Код интеграции служб (например, шаблоны доступа к данным) находится в структуре и предоставляется разработчикам приложений. В отличие от этого, EJB 3 интегрируется в сервер приложений, а код интеграции сервисов инкапсулируется за интерфейсом. Таким образом, поставщики EJB 3 могут оптимизировать производительность и опыт разработчиков, работая на уровне сервера приложений. Например, они могут тесно связать механизм JPA с управлением транзакциями JTA. Другой пример - поддержка кластеризации, которая прозрачна для разработчиков EJB 3.
EJB 3 не идеален, хотя ему все еще не хватает некоторых функций (например, внедрение неуправляемых компонентов, таких как простые POJO).
Баллы Паскаля действительны. Есть, однако, следующие в пользу весны.
Спецификация EJB на самом деле немного неэффективна, и поэтому на разных серверах приложений можно наблюдать различные варианты поведения. Конечно, это не будет верно для большинства случаев, но у меня была такая проблема для некоторых "темных углов".
В Spring есть много дополнительных возможностей, таких как spring-test, AOP, MVC, интеграция JSF и т. Д. В EJB есть некоторые из них (например, перехватчики), но, на мой взгляд, они не так уж и развиты.
В заключение, это зависит в основном от вашего конкретного случая.
Spring предназначен для дополнения EJB, а не для его замены. Spring - это слой поверх EJB. Как мы знаем, кодирование EJB выполняется с использованием API, что означает, что мы должны реализовывать все в API с использованием среды Spring. Мы можем создать код котельной пластины, затем просто взять эту плиту, добавить кое-что к ней, и все будет сделано. Внутренне Spring связан с EJB - Spring не существовал бы без EJB.
Основным преимуществом использования Spring является отсутствие связи между классами.