What Is CDI, How Does It Relate to @EJB And Spring?
Context Dependency Injection (CDI, JSR 299) is a part of Java EE 6 Web Profile and itself builds on Dependency Injection for Java (JSR 330), which introduces @Inject, @Named etc. While JSR 330 is for DI only and is implemented e.g. by Guice and Spring, CDI adds various EE stuff such as @RequestScoped, interceptors/decorators, producers, eventing and a base for integration with JSF, EJBs etc. Java EE components such as EJBs have been redefined to build on top of CDI (=> @Stateless is now a CDI managed bean with additional services).
A key part of CDI aside of its DI capabilities is its awarness of bean contexts and the management of bean lifecycle and dependencies within those contexts (such as @RequestScoped or @ConversationScoped).
CDI is extensible – you can define new context scopes, drop-in interceptors and decorators, make other beans (e.g. from Spring) available for CDI.
Resources to check:
- Contexts and Dependency Injection in Java EE 6 by Adam Bien – a very good explanation of the basics of CDI and how it differs from DI in Java EE 5 (hint: context awarness)
- Slideshow with a good overview of CDI and all it offers
- About CDI extensibility and SPIs (e.g. Seam 3 is basically a set of portable CDI extensions)
- Guice and Spring do not implement CDI (3/2011) – and Spring perhaps isn’t motivated to do so (it supports JSR 330, CDI would be too much work)
- DZone CDI Refcard may be handy
- CDI 1.0 vs. Spring 3.1 feature comparsion: bean definition & dependency injection: “in the area that I compared in this article [= DI], there is only little critical difference in the two technologies” (though Spring more fine-tunable)
- Java EE 6 (CDI / EJB 3.1) XOR Spring Core Reloaded: New projects should preferably start with pure Java EE including CDI and add Spring utilities such as JDBC/JMS when needed
- Oracle: CDI in the Java EE 6 Ecosystem – 62 pages slideshow, the stuff is explained more than in the previously mentioned slideshow
Note: CDI 1.1 (JSR 346, Java EE 7) should have a standard way of bootstrapping it in non-EE environment (i.e. SE).
Reference: What Is CDI, How Does It Relate to @EJB And Spring? from our JCG partner at the Holy Java blog.
- Java EE6 CDI, Named Components and Qualifiers
- Java EE6 Decorators: Decorating classes at injection time
- Java Modularity Approaches – Modules, modules, modules
- On domain-driven design, anemic domain models, code generation, dependency injection and more…
- Basic EJB References, Injection and Lookup
- Java Tutorials and Android Tutorials list
CDI is going to be the future