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