Risposte:
Spring è stato sviluppato come alternativa a EJB sin dal suo inizio, quindi la risposta è ovviamente che puoi usare Spring al posto di EJB.
Se c'è un "vantaggio" nell'usare EJB, direi che dipenderà dalle capacità del tuo team. Se non hai esperienza in Spring e molta esperienza con EJB, forse restare con EJB 3.0 è una buona mossa.
I server di app scritti per supportare lo standard EJB possono, in teoria, essere trasferiti da un server di app Java EE conforme a un altro. Ma questo significa stare lontano da tutte le estensioni specifiche del fornitore che ti vincolano a un unico fornitore.
Spring porte facilmente tra i server delle app (ad esempio, WebLogic, Tomcat, JBOSS, ecc.) Perché non dipende da loro.
Tuttavia, sei bloccato nella primavera.
Spring incoraggia buone pratiche di progettazione OO (ad esempio, interfacce, livelli, separazione delle preoccupazioni) a vantaggio di qualsiasi problema che tocchino, anche se decidi di passare a Guice o un altro framework DI.
Aggiornamento: questa domanda e risposta risalgono a cinque anni fa nel 2014. Va detto che il mondo della programmazione e dello sviluppo di applicazioni è cambiato molto in quel periodo.
Non è più solo una scelta tra Java o C #, Spring o EJB. Con vert.x è possibile evitare del tutto Java EE. È possibile scrivere applicazioni poliglotte altamente scalabili senza un server app.
Aggiornamento: è marzo 2016 ora. Spring Boot offre un modo ancora migliore per scrivere applicazioni senza server di app Java EE. È possibile creare un JAR eseguibile ed eseguirlo su una JVM.
Mi chiedo se Oracle continuerà a supportare le specifiche Java EE. I servizi Web hanno preso il sopravvento per gli EJB. La soluzione EJB è morta. (Solo la mia opinione.)
Per prima cosa, lascia che lo dica chiaramente, non sto dicendo che non dovresti usare Spring ma, poiché stai chiedendo alcuni vantaggi, eccone almeno due:
EJB 3 è uno standard mentre Spring non lo è (è uno standard de facto ma non è la stessa cosa) e questo non cambierà nel prossimo futuro. Sebbene sia possibile utilizzare il framework Spring con qualsiasi server di applicazioni, le applicazioni Spring sono bloccate sia in Spring stesso che nei servizi specifici che si sceglie di integrare in Spring.
Il framework Spring si trova sopra i server delle applicazioni e le librerie di servizi. Il codice di integrazione del servizio (ad es. Modelli di accesso ai dati) risiede nel framework ed è esposto agli sviluppatori dell'applicazione. Al contrario, il framework EJB 3 è integrato nel server delle applicazioni e il codice di integrazione del servizio è incapsulato dietro un'interfaccia. I fornitori di EJB 3 possono quindi ottimizzare le prestazioni e l'esperienza degli sviluppatori lavorando a livello di server delle applicazioni. Ad esempio, possono legare strettamente il motore JPA alla gestione delle transazioni JTA. Un altro esempio è il supporto del clustering, trasparente per gli sviluppatori EJB 3.
EJB 3 non è perfetto, però, manca ancora di alcune funzionalità (es. Iniezione di componenti non gestiti come semplici POJO).
I punti di Pascal sono validi. Ci sono, tuttavia, i seguenti a favore della primavera.
La specifica EJB è in realtà un po 'allentata e quindi è possibile osservare comportamenti diversi con diversi server delle applicazioni. Questo non sarà vero per la maggior parte dei casi, ovviamente, ma ho avuto un tale problema per alcuni "angoli bui".
Spring ha molte chicche extra, come spring-test, AOP, MVC, integrazione JSF, ecc. EJB ne ha alcune (interceptor, per esempio), ma secondo me non sono molto sviluppate.
In conclusione, dipende principalmente dal tuo caso esatto.
EJBContainer.createEJBContainer()
API standard per utilizzare un contenitore incorporato. Quindi, comunque, la tua affermazione è sbagliata.
La primavera è pensata per completare EJB, non per sostituirlo. La primavera è uno strato sopra EJB. Come sappiamo, la codifica di EJB viene eseguita utilizzando l'API, il che significa che dobbiamo implementare tutto nelle API utilizzando il framework Spring. Possiamo creare il codice boilerplate, quindi prendere quel piatto, aggiungerci delle cose, poi tutto è fatto. Internamente Spring è connesso con EJB - Spring non esisterebbe senza EJB.
Il vantaggio principale dell'utilizzo di Spring è che non vi è alcun accoppiamento tra le classi.