Lets create a sample project to demonstrate how contexts and dependency injection (CDI) works with servlet
1. Create a sample bean file
package edu.learn.cdi.demo.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.io.Serializable;
@Named
@ApplicationScoped
public class ServiceBean implements Serializable {
@PostConstruct
public void init() {
System.out.println("ServiceBean->Cdi bean");
}
//Will be called when @SessionScoped
@PreDestroy
public void destroying() {
System.out.println("ServiceBean->Cdi bean");
}
public int doWork(int a, int b) {
return a + b;
}
}
2. Create a test servlet to consume CDI
package edu.learn.cdi.demo.servlet;
import edu.learn.cdi.demo.bean.ServiceBean;
import javax.inject.Inject;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "testServlet", urlPatterns = {"/testcdi"})
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 2638127270022516617L;
@Inject
private ServiceBean service;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
int a = 2;
int b = 3;
PrintWriter out = response.getWriter();
out.println("Hello World: " + service.doWork(a, b));
out.close();
//Just to call @PreDestroy method in ServiceBean
request.getSession().invalidate();
}
}
3. Create a beans.xml file in WEB-INF
<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="annotated"
>
<!--Optional, just write to keep remember how to exclude not needed classes-->
<scan>
<exclude name="edu.learn.cdi.demo.servlet"></exclude>
</scan>
</beans>
4. Create a context.xml file in META-INF (optional)
<?xml version='1.0' encoding='utf-8'?>
<Context>
<!--<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"/>-->
</Context>
5. Add the following dependencies in your pom.xml
<dependencies>
<!-- Jersey cdi (weld) dependency -->
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey2.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext.cdi</groupId>
<artifactId>jersey-cdi1x-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-core</artifactId>
<version>3.1.2.Final</version>
</dependency>
<!-- JDK 11 support for XML -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<build>
<finalName>cdi</finalName>
</build>
6. To test your CDI application by typing the following
http://localhost:8080/cdi/testcdi