JavaEE CDI - Contexts and Dependency Injection
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
- @Dependent - Default scope of bean in CDI, It is bound to the scope of bean it get injected and won't be shared
- @RequestScoped – bound to the HTTP request
- @SessionScoped – bound to the HTTP session of an user
- @ApplicationScoped – it is like a Singleton bean, one instance per application.
- @ConversationScoped – bound to a conversation context.
- @ViewScope - Scope related to JSF
- @FlowScoped - Scope related to JSF
- @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
### 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