Dependency Injection: Can inject anything in the container including EJBs, data sources, JMS resources and JPA resources. | Dependency Injection: Can inject almost anything including lists, maps, properties and JNDI resources. |
Transaction management: Works right out of the box, but only JTA is supported. | Transaction management: Have to configure it to make it work, but supports a number of strategies including JTA, JDBC and Hibernate. |
Persistence: Tightly integrated through JPA. | Persistence: Framework support for JPA, Hibernate, JDBC, iBatis. |
State management: Robust support through Stateful Session Beans and Extended Persistence Context. | State management: Indirect support dependent on web container session management. |
Web Services: Seamless support for JAX-WS 2.0 | Web Services: Poor direct support, best integration available is via configuring XFire for registered beans. |
Messaging: Supported out of the box through Message Driven Beans. | Messaging: Need to add configuration for message listeners. However, JMSTemplate adds nice abstraction over JMS. |
AOP: Simple but limited support through interceptors. | AOP: Robust support through AspectJ and Spring AOP alliance. |
Security: Integrated support for declarative and programmatic security through JAAS. | Security: Must add and configure Acegi security. However, support beyond JAAS is possible through Acegi. |
Scheduling: Simple scheduling possible through EJB Timer service. | Scheduling: Must add and configure Quartz for scheduling. |
Remoting: Integrated support through Session Bean remote interfaces. Supports distributed transactions and security. | Remoting: Remoting support may be added via configuration. Remote transactions and security are not supported. However protocols other than RMI such as Hessian and Burlap are supported. |
Use EJB 3 If:
- You like annotation and dislike a lot of XML configuration.
- You prefer a tightly integrated solution stack that makes sensible default choices for you and minimizes configuration.
- Your application is very stateful.
- Standardization is an important consideration.
- You use JSF and are considering using Seam. | Use Spring if:
- Your application requires fine-grained control at the container level.
- Your application requires a lot of configuration beyond gluing together components and resources.
- You need advance AOP feathers. |