Spring vs EJB. O Spring pode substituir o EJB? [fechadas]

96

Já que o Spring é capaz de usar transações exatamente como EJB . Para mim, o Spring é capaz de substituir o requisito de usar EJB. Alguém pode me dizer quais são as vantagens extras de usar EJB?

cometta
fonte

Respostas:

201

O Spring foi desenvolvido como uma alternativa ao EJB desde o seu início, então a resposta é claro que você pode usar o Spring no lugar dos EJBs.

Se houver uma "vantagem" em usar EJBs, eu diria que dependeria das habilidades de sua equipe. Se você não tem nenhum conhecimento em Spring e muita experiência em EJB, talvez seja uma boa ideia manter o EJB 3.0.

Os servidores de aplicativos escritos para suportar o padrão EJB podem, em teoria, ser transferidos de um servidor de aplicativos compatível com Java EE para outro. Mas isso significa ficar longe de todas as extensões específicas do fornecedor que o prendem a um fornecedor.

Portas Spring facilmente entre servidores de aplicativos (por exemplo, WebLogic, Tomcat, JBOSS, etc.) porque não depende deles.

No entanto, você está preso na Primavera.

Spring incentiva boas práticas de design OO (por exemplo, interfaces, camadas, separação de interesses) que beneficiam qualquer problema que eles tocam, mesmo se você decidir mudar para Guice ou outro framework de DI.

Atualização: Esta pergunta e resposta completaram cinco anos em 2014. É preciso dizer que o mundo da programação e do desenvolvimento de aplicativos mudou muito desde então.

Não é mais apenas uma escolha entre Java ou C #, Spring ou EJBs. Com vert.x é possível evitar o Java EE completamente. Você pode escrever aplicativos poliglotas altamente escalonáveis ​​sem um servidor de aplicativos.

Atualização: é março de 2016 agora. Spring Boot oferece uma maneira ainda melhor de escrever aplicativos sem servidores de aplicativos Java EE. Você pode criar um JAR executável e executá-lo em uma JVM.

Eu me pergunto se a Oracle continuará a oferecer suporte à especificação Java EE. Os serviços da Web assumiram o controle dos EJBs. A solução EJB está morta. (Apenas minha opinião.)

duffymo
fonte
7
Na minha opinião, "travar" é uma frase muito forte para descrever o Spring. Afinal, o Spring foi projetado para colar tudo junto, não para substituí-los, você sempre pode escolher com o que deseja integrar. Além disso, tudo tem lock-ins, até mesmo o mais simples Apache Commons nos trava, mas ainda o usamos todos os dias.
Christopher Yang
3
Não há fornecedores alternativos ao VMWare / Spring da maneira que você pode escolher entre as plataformas Oracle, Red Hat e IBM para Java EE. Isso é tudo que eu quis dizer. Não é um comentário sobre a capacidade ou utilidade do Spring. Acontece que eu gosto muito. Eu uso todos os dias e durmo à noite.
duffymo
1
@ChristopherYang isso é correto. Quer dizer, "Java" seria um bloqueio de fornecedor. Então, eventualmente, só precisamos parar de discutir e fazer algo. :-)
cbmeeks
4
Esta pergunta tem quase cinco anos. Pessoalmente, acho que os EJBs são tecnologias ultrapassadas que perderam em todos os sentidos para os serviços da Web HTTP. Vitória simples e aberta. Dê-me serviços REST e você pode manter seus EJBs. A primavera os suporta muito bem. É para onde o mundo foi.
duffymo
1
Obrigado pela resposta. Apenas procurando os benefícios como avaliar o melhor (SPRING, EJB 3.x) para a migração do aplicativo EJB 2.1 existente. Mais uma pergunta, EJB 3.x também suporta o WebService. Então, poderíamos obter o benefício de JNDI / RMI para distribuição de aplicativos Java e WS para outros aplicativos?
fronteiras
48

Em primeiro lugar, deixe-me dizer com clareza, não estou dizendo que você não deva usar Spring, mas, como você está pedindo algumas vantagens, aqui estão pelo menos duas delas:

  • EJB 3 é um padrão, enquanto o Spring não é (é um padrão de fato, mas não é a mesma coisa) e isso não mudará no futuro previsível. Embora você possa usar a estrutura Spring com qualquer servidor de aplicativos, os aplicativos Spring são bloqueados tanto no próprio Spring quanto nos serviços específicos que você escolher integrar no Spring.

  • A estrutura Spring fica sobre os servidores de aplicativos e bibliotecas de serviço. O código de integração de serviço (por exemplo, modelos de acesso a dados) reside na estrutura e é exposto aos desenvolvedores de aplicativos. Em contraste, a estrutura EJB 3 é integrada ao servidor de aplicativos e o código de integração de serviço é encapsulado por trás de uma interface. Os fornecedores de EJB 3 podem, portanto, otimizar o desempenho e a experiência do desenvolvedor trabalhando no nível do servidor de aplicativos. Por exemplo, eles podem vincular o mecanismo JPA estreitamente ao gerenciamento de transações JTA. Outro exemplo é o suporte de cluster, que é transparente para os desenvolvedores de EJB 3.

O EJB 3 não é perfeito, porém, ainda carece de alguns recursos (por exemplo, injeção de componentes não gerenciados como POJOs simples).

Pascal Thivent
fonte
1
Resposta educacional, mas estou me perguntando por que / quando você precisa injetar um POJO simples em vez de inicializar um novo?
Ömer Faruk Almalı
4
Para fins de teste.
Philip
22

Os pontos de Pascal são válidos. Existem, no entanto, os seguintes a favor da primavera.

  • A especificação EJB é um pouco flexível e, portanto, comportamentos diferentes podem ser observados em servidores de aplicativos diferentes. Isso não será verdade para a maioria dos casos, é claro, mas eu tive esse problema para alguns "cantos escuros".

  • O Spring tem muitos benefícios extras, como spring-test, AOP, MVC, integração JSF, etc. EJB tem alguns deles (interceptores, por exemplo), mas na minha opinião eles não são muito desenvolvidos.

Em conclusão, depende principalmente do seu caso exato.

Bozho
fonte
Talvez algo como Spring precise apenas de um mecanismo de servlet seria mais preciso (EJB pode ser usado em qualquer contêiner JEE, mecanismo de servlet! = Contêiner JEE).
Pascal Thivent
1
Bem, tecnicamente, o Spring também não requer um mecanismo de servlet. Por exemplo, o spring-test usa um contexto na memória.
Bozho
3
Bem, tecnicamente, os EJBs não exigem um contêiner autônomo nem se você for por aqui. Desde EJB 3.1 existe a EJBContainer.createEJBContainer()API padrão para usar um contêiner integrado. Portanto, ainda assim, sua afirmação está errada.
Pascal Thivent
ok, 3.1 é bastante novo e obviamente esqueci das adições. Removido esse ponto da minha resposta.
Bozho
-30

O objetivo do Spring é complementar o EJB, não substituí-lo. A primavera é uma camada sobre o EJB. Como sabemos, a codificação do EJB é feita usando API, o que significa que temos que implementar tudo em APIs usando o framework Spring. Podemos criar um código padrão e, em seguida, pegar essa placa, adicionar algumas coisas a ela e, então, tudo pronto. Internamente, o Spring está conectado ao EJB - o Spring não existiria sem o EJB.

A principal vantagem de usar o Spring é que não há nenhum acoplamento entre as classes.

sasi
fonte
8
você está totalmente errado, desculpe
Jakub H
2
desculpe @sasi, isso não chega nem perto de uma resposta correta ou agradável .......
Prakash
4
"A primavera não existiria sem EJB." Cara, você é de verdade? Você já usou o "\ @Stateless" na declaração de um EJB ou usou a anotação \ @EJB para injeção? Você acha que esses funcionariam no Jetty ou Tomcat? Como você acha que as transações são gerenciadas na primavera? Você sabe que pode implantar um aplicativo Spring em um contêiner de servlet, certo?
99Sono
Desculpe, mas você não tem um entendimento bem estruturado de ambos, EJBs como parte do Java EE e primavera como o princípio de convenção sobre configuração. Na verdade, se você não cavar fundo, você pode acabar pensando que eles são a mesma coisa ou parentes ou qualquer coisa desse tipo. Por quê? ambos têm semelhanças como injeção e, mas a diferença entre eles é enorme. É verdade que o Spring nasceu como alternativa ao EJB de volta no tempo devido à complexidade do EJB, mas foi. Bom o suficiente durante o tempo de Java EE 5 (EJB 3) foi retocado, também fazendo como a primavera estava fazendo com seu COC
Ishimwe Aubain Consolateur