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

Popular posts from this blog

Creating simple Maven multi module project in Java

How to update existing CCDT file (AMQCLCHL.TAB) for successful MQueue connection

Executing Store procedure without out parameters and input parameters in Spring