Spring Boot Listener
July 18, 2018
This page will walk through Spring Boot Listener example. We can register servlet listeners in Spring Boot using either ServletListenerRegistrationBean
or @Component
or @ServletComponentScan
. ServletListenerRegistrationBean
class registers servlet listeners as Spring bean. @ServletComponentScan
annotation scans servlet listeners annotated with @WebListener
and it works only when using embedded server. In our example, we will create listeners using HttpSessionListener
and ServletContextListener
and provide complete example to register them in Spring Boot.
Contents
Technologies Used
Find the technologies being used in our example.1. Java 9
2. Spring 5.0.7.RELEASE
3. Spring Boot 2.0.3.RELEASE
4. Maven 3.5.2
5. Eclipse Oxygen
Register Listener with ServletListenerRegistrationBean
ServletListenerRegistrationBean
registers a servlet Listener as Spring bean. ServletListenerRegistrationBean
provides setListener()
method to assign the listener. Suppose we have listeners as following.
SessionCountListener.java
public class SessionCountListener implements HttpSessionListener { ------ }
public class AdminInfoListener implements ServletContextListener { ------ }
ServletListenerRegistrationBean
class to register our listeners as Spring bean.
WebConfig.java
@Configuration public class WebConfig { //Register SessionCountListener @Bean public ServletListenerRegistrationBean<SessionCountListener> sessionCountListener() { ServletListenerRegistrationBean<SessionCountListener> listenerRegBean = new ServletListenerRegistrationBean<>(); listenerRegBean.setListener(new SessionCountListener()); return listenerRegBean; } //Register AdminInfoListener @Bean public ServletListenerRegistrationBean<AdminInfoListener> adminInfoListener() { ServletListenerRegistrationBean<AdminInfoListener> listenerRegBean = new ServletListenerRegistrationBean<>(); listenerRegBean.setListener(new AdminInfoListener()); return listenerRegBean; } ------ }
Register Listener with @Component
We can register servlet listeners in Spring Boot by annotating it with Spring@Component
as following.
SessionCountListener.java
@Component public class SessionCountListener implements HttpSessionListener { ------ }
@Component public class AdminInfoListener implements ServletContextListener { ------ }
Register Listener with @ServletComponentScan and @WebListener
We can register servlet listeners using@ServletComponentScan
with @Configuration
or @SpringBootApplication
annotations. The servlet listeners annotated with @WebListener
will be scanned by @ServletComponentScan
. It also scans servlets and filters annotated with @WebServlet
and @WebFilter
respectively. @ServletComponentScan
works only when using embedded server. Find the sample listeners annotated with @WebListener
.
SessionCountListener.java
@WebListener public class SessionCountListener implements HttpSessionListener { ------ }
@WebListener public class AdminInfoListener implements ServletContextListener { ------ }
@ServletComponentScan
with @SpringBootApplication
in Main class as following.
SpringBootAppStarter.java
@ServletComponentScan @SpringBootApplication public class SpringBootAppStarter { public static void main(String[] args) { SpringApplication.run(SpringBootAppStarter.class, args); } }
Complete Example: Listener + Filter + Servlet
Here we will provide complete example to register listeners, filters and servlets in Spring Boot. We will useServletListenerRegistrationBean
to register listeners, FilterRegistrationBean
to register filters and ServletRegistrationBean
to register servlets.
Find the project structure.

pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.concretepage</groupId> <artifactId>spring-boot-app</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-app</name> <description>Spring Boot Application</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> <properties> <java.version>9</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
package com.concretepage.listeners; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionCountListener implements HttpSessionListener { private final AtomicInteger sessionCount = new AtomicInteger(); @Override public void sessionCreated(HttpSessionEvent se) { sessionCount.incrementAndGet(); setActiveSessionCount(se); } @Override public void sessionDestroyed(HttpSessionEvent se) { sessionCount.decrementAndGet(); setActiveSessionCount(se); } private void setActiveSessionCount(HttpSessionEvent se) { se.getSession().getServletContext() .setAttribute("activeSessions", sessionCount.get()); System.out.println("Total Active Session: " + sessionCount.get()); } }
package com.concretepage.listeners; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class AdminInfoListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContextEvent initialized."); ServletContext sc = sce.getServletContext(); sc.setAttribute("admin", "Krishna"); } @Override public void contextDestroyed(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); sc.removeAttribute("admin"); System.out.println("ServletContextEvent destroyed."); } }
package com.concretepage.filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class ABCFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("Inside ABCFilter: "+ req.getRequestURI()); chain.doFilter(request, response); } @Override public void destroy() { } }
package com.concretepage.filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class XYZFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("Inside XYZFilter: "+ req.getRequestURI()); chain.doFilter(request, response); } @Override public void destroy() { } }
package com.concretepage.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloCountryServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ doGet(request,response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); request.getSession(); out.println("<h3>Hello India!</h3>"); out.println("Admin: " + request.getServletContext().getAttribute("admin")); out.println("<br/>Total Active Session: "+ request.getServletContext().getAttribute("activeSessions")); } }
package com.concretepage.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloStateServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ doGet(request,response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); request.getSession(); PrintWriter out = response.getWriter(); out.println("<h3>Hello Uttar Pradesh!</h3>"); out.println("Admin: " + request.getServletContext().getAttribute("admin")); out.println("<br/>Total Active Session: "+ request.getServletContext().getAttribute("activeSessions")); } }
package com.concretepage; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import com.concretepage.filters.ABCFilter; import com.concretepage.filters.XYZFilter; import com.concretepage.listeners.AdminInfoListener; import com.concretepage.listeners.SessionCountListener; import com.concretepage.servlets.HelloCountryServlet; import com.concretepage.servlets.HelloStateServlet; @Configuration public class WebConfig { //Register SessionCountListener @Bean public ServletListenerRegistrationBean<SessionCountListener> sessionCountListener() { ServletListenerRegistrationBean<SessionCountListener> listenerRegBean = new ServletListenerRegistrationBean<>(); listenerRegBean.setListener(new SessionCountListener()); return listenerRegBean; } //Register AdminInfoListener @Bean public ServletListenerRegistrationBean<AdminInfoListener> adminInfoListener() { ServletListenerRegistrationBean<AdminInfoListener> listenerRegBean = new ServletListenerRegistrationBean<>(); listenerRegBean.setListener(new AdminInfoListener()); return listenerRegBean; } //Register ABCFilter @Bean public FilterRegistrationBean<ABCFilter> abcFilter() { FilterRegistrationBean<ABCFilter> filterRegBean = new FilterRegistrationBean<>(); filterRegBean.setFilter(new ABCFilter()); filterRegBean.addUrlPatterns("/app/*"); filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -1); return filterRegBean; } //Register XYZFilter @Bean public FilterRegistrationBean<XYZFilter> xyzFilter() { FilterRegistrationBean<XYZFilter> filterRegBean = new FilterRegistrationBean<>(); filterRegBean.setFilter(new XYZFilter()); filterRegBean.addUrlPatterns("/app/*"); filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -2); return filterRegBean; } //Register HelloCountryServlet @Bean public ServletRegistrationBean<HelloCountryServlet> countryServlet() { ServletRegistrationBean<HelloCountryServlet> servRegBean = new ServletRegistrationBean<>(); servRegBean.setServlet(new HelloCountryServlet()); servRegBean.addUrlMappings("/app/country/*"); servRegBean.setLoadOnStartup(1); return servRegBean; } //Register HelloStateServlet @Bean public ServletRegistrationBean<HelloStateServlet> stateServlet() { ServletRegistrationBean<HelloStateServlet> servRegBean = new ServletRegistrationBean<>(); servRegBean.setServlet(new HelloStateServlet()); servRegBean.addUrlMappings("/app/state/*"); servRegBean.setLoadOnStartup(1); return servRegBean; } }
package com.concretepage.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @RequestMapping("/app/world") public String helloMsg(HttpServletRequest request) { request.getSession(); String msg1 = "Admin: " + request.getServletContext().getAttribute("admin"); String msg2 = "Active Session Count: " + request.getServletContext().getAttribute("activeSessions"); return msg1 + ", " + msg2; } }
package com.concretepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootAppStarter { public static void main(String[] args) { SpringApplication.run(SpringBootAppStarter.class, args); } }
Test Application
We can run our Spring Boot application in following ways.1. Using Maven Command: Download the project source code. Go to the root folder of the project using command prompt and run the command.
mvn spring-boot:run
2. Using Eclipse: Download the project source code using the download link given at the end of article. Import the project into eclipse. Using command prompt, go to the root folder of the project and run.
mvn clean eclipse:eclipse
SpringBootAppStarter
by clicking Run as -> Java Application. Tomcat server will be started.
3. Using Executable JAR: Using command prompt, go to the root folder of the project and run the command.
mvn clean package
java -jar target/spring-boot-app-0.0.1-SNAPSHOT.jar
Now we are ready to test the application. Run the following URL.
http://localhost:8080/app/country
Output
Hello India! Admin: Krishna Total Active Session: 1
References
Class ServletListenerRegistrationBeanSpring Boot Reference Guide
Spring Boot Servlet Mapping
Spring Boot Filter