EJB3 в итоге состоит из 3 типов бинов; Компоненты, управляемые сообщениями, Сессионные компоненты без состояний и состояний и Компонентные компоненты или JPA (архитектура устойчивости Java). Hibernate может использоваться в качестве поставщика JPA, но его не нужно использовать таким образом.
Spring имеет функциональность, которая примерно аналогична компонентам, управляемым сообщениями, и сеансным компонентам без сохранения состояния / состояния, но не имеет эквивалента JPA. Вместо этого он позволяет вам использовать JPA или hibernate напрямую, но если вы объедините Spring с JPA, вам понадобится EJB-контейнер.
Другое отличие состоит в том, что EJB обеспечивается «контейнерами», тогда как spring - это инфраструктура, которую можно развернуть в приложении java se или веб-приложении контейнера java-сервлетов, таких как jetty или tomcat. Это важное различие. Tomcat - это не EJB-контейнер, а только контейнер сервлетов, поэтому, если бы вы использовали только базовый tomcat, вы не могли бы использовать EJB, но вы могли бы использовать Spring, включив необходимые файлы JAR Spring в свое веб-приложение (WEB-INF / lib). ). В этом случае вы также не будете использовать JPA, но вы можете использовать спящий режим.
Некоторые java-серверы, являющиеся EJB-контейнерами, включают weblogic, websphere, jboss, geronimo и glassfish. Tomcat может стать контейнером EJB, если вы объедините его с OpenEJB.
В приложении, которое я сейчас разрабатываю, я использую tomcat + openejb, поэтому у меня есть контейнер EJB, поэтому я могу использовать JPA с OpenJPA в качестве поставщика персистентности. Я использую Spring MVC для разработки веб-приложений и, скорее всего, буду использовать Spring Security в будущем. Я, вероятно, также буду использовать EJB-компоненты Sessionless без состояний для инкапсуляции бизнес-функций, но я также мог бы с легкостью использовать бины Spring service / dao вместо статичных EJB-сессий.
Иногда довольно сложно понять, какие части какой инфраструктуры или контейнера вам следует использовать, и действительно сводится либо к предпочтениям, либо к использованию функциональности в одной, которой нет в другой, или в простоте использования. Другое соображение - использование памяти. Некоторые из контейнеров ejb занимают большие объемы памяти, просто запускаясь без запуска приложений. Это одна из причин, по которой я использовал tomcat + openejb. Надеюсь, это поможет.