JavaEE CDI - Contexts and Dependency Injection
CDI (Contexts and Dependency Injection) is a standard dependency injection framework included in Java EE 6 onwards. CDI is also part of the Eclipse MicroProfile project, a framework use for development of Microservice application.
### CDI Releases | CDI Version | Release Year| |:-----------:|:-----------:| | CDI 1.0 | 2009 | | CDI 1.1 | 2013 | | CDI 1.2 | 2014 | | CDI 2.0 | 2017 | | CDI 3.0 | 2020 | | CDI 4.0 | 2022 | ### New Features - Removal of deprecated code Ex - **@New** qualifier which was deprecated in version 1.1 - Change in Bean discovery Mode CDI 4.0 bean discovery mode is by default Annotated - Support for Java Module system ( introduced in Java v9) - Introducing CDI Lite #### The “beans.xml” File First, we must place a **beans.xml** file in the - **src/main/resources/META-INF/** folder with **bean-discovery-mode** set to ```all``` or ``annotated`` Even if this file doesn't contain any specific dependency Injection directives at all, it's required for getting CDI up and running. bean.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all"> </beans> ``` Bean can be Injected using following injection: - Fields - Setter - constructor #### CDI Bean Scope There are **eight**, differnt scopes defined for the bean as per Java EE specification 1. **@Dependent** - Default scope of bean in CDI, It is bound to the scope of bean it get injected and won't be shared 2. **@RequestScoped** – bound to the HTTP request 3. **@SessionScoped** – bound to the HTTP session of an user 4. **@ApplicationScoped** – it is like a Singleton bean, one instance per application. 5. **@ConversationScoped** – bound to a conversation context. 6. **@ViewScope** - Scope related to JSF 7. **@FlowScoped** - Scope related to JSF 8. **@Transaction** - Transactional scope #### Important CDI annotations and their Usage - **@Inject** - Inject the dependency in client class. - **@Default** - refers to default implementation. CDI, by default, annotates all the implementations of an interface with the **@Default** annotation. - **@Named** - If a service has multiple implementation then to remove the ambiquity we can use \@Named annotation. It also make bean accessible to Expression Language.The bean is accessed by using the bean name with the first letter in lowercase For example: Service Implementation: ``` @Named("GifFileEditor") public class GifFileEditor implements ImageFileEditor ``` Inject the dependency as follow: ``` @Inject private final @Named("GifFileEditor") ImageFileEditor imageFileEditor; ``` - **@Qualifier** - CDI supports the use of custom qualifiers for qualifying dependencies and solving ambiguous injection points. They not only bind a semantic name to a service, but they bind injection metadata too. CDI uses the object’s type to resolve injections. When the type is insufficient to identify what instance to inject, then a custom \@Qualifier annotation can be used to disambiguate concrete implementations. - **@Produces** - Dynamic approach for creating a bean that is managed by CDI container. - **@Disposes** - identify the dispose parameter of a disposer method. A disposer method allows the application to perform customized cleanup of an object returned by a producer method or producer field. **@Decorator** **@Priority**
Comments
Post a Comment