Respostas:
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.)
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).
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.
EJBContainer.createEJBContainer()
API padrão para usar um contêiner integrado. Portanto, ainda assim, sua afirmação está errada.
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.