|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.