Spring – How to do dependency injection in your session listener
Spring comes with a “ContextLoaderListener” listener to enable Spring dependency injection into session listener. In this tutorial, it revises this HttpSessionListener example by adding a Spring dependency injection a bean into the session listener.
1. Spring Beans
Create a simple counter service to print total number of sessions created.
File : CounterService.java
package com.mkyong.common; public class CounterService{ public void printCounter(int count){ System.out.println("Total session created : " + count); } }
File : counter.xml – Bean configuration file.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="counterService" class="com.mkyong.common.CounterService" /> </beans>
2. WebApplicationContextUtils
Uses “WebApplicationContextUtils” to get the Spring’s context, and later you can get any declared Spring’s bean in a normal Spring’s way.
File : SessionCounterListener.java
package com.mkyong.common; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; public class SessionCounterListener implements HttpSessionListener { private static int totalActiveSessions; public static int getTotalActiveSession(){ return totalActiveSessions; } @Override public void sessionCreated(HttpSessionEvent arg0) { totalActiveSessions++; System.out.println("sessionCreated - add one session into counter"); printCounter(arg0); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { totalActiveSessions--; System.out.println("sessionDestroyed - deduct one session from counter"); printCounter(arg0); } private void printCounter(HttpSessionEvent sessionEvent){ HttpSession session = sessionEvent.getSession(); ApplicationContext ctx = WebApplicationContextUtils. getWebApplicationContext(session.getServletContext()); CounterService counterService = (CounterService) ctx.getBean("counterService"); counterService.printCounter(totalActiveSessions); } }
3. Integration
The only problem is, how your web application know where to load the Spring bean configuration file? The secret is inside the “web.xml” file.
- Register “
ContextLoaderListener” as the first listener to make your web application aware of the Spring context loader. - Configure the “
contextConfigLocation” and define your Spring’s bean configuration file.
File : web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/Spring/counter.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> com.mkyong.common.SessionCounterListener </listener-class> </listener> <servlet> <servlet-name>Spring DI Servlet Listener</servlet-name> <servlet-class>com.mkyong.common.App</servlet-class> </servlet> <servlet-mapping> <servlet-name>Spring DI Servlet Listener</servlet-name> <url-pattern>/Demo</url-pattern> </servlet-mapping> </web-app>
File : App.java
package com.mkyong.common; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class App extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ HttpSession session = request.getSession(); //sessionCreated() is executed session.setAttribute("url", "mkyong.com"); session.invalidate(); //sessionDestroyed() is executed PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Spring Dependency Injection into Servlet Listenner</h1>"); out.println("</body>"); out.println("</html>"); } }
Start Tomcat, and access the URL “http://localhost:8080/SpringWebExample/Demo“.
output
sessionCreated - add one session into counter Total session created : 1 sessionDestroyed - deduct one session from counter Total session created : 0
See the console output, you get the counter service bean via Spring DI, and print the total number of sessions.
Conclusion
In Spring, the “ContextLoaderListener” is a generic way to integrate Spring Dependency Injection to almost all of the web application.







Hi ,
Is There a way to set dependencies here ?
For example , if the loading of my xml in contextConfigLocation depends on a spring remote service , Can I tell the listener to wait till the remote service is available ?
Lovely thanks for sharing.
Hi mkyong!
Is it possible to inject the “CounterService” with annotations? I would prefer something like that:
I didn’t get it with @Autowired. I also tried to annotate the class with @Component and I configured the following in my Spring configuration:
Do you have an idea?
Best regards,
Sebastian
PS: Very good pages!
[...] RESTEasyt-Spring-Integration-Example.zip (9 KB)ReferencesAccessing Spring beans from legacy codeGeneral way to integrate Spring with others frameworkBetter than nothing RESTEasy + Spring exampleApplicationContextAware JavaDocWiki Singleton pattern [...]
org.postgresql.util.PSQLException: ERROR: relation “qrtz_locks” does not exist
i am getting this error ,, any comment
This article is nothing to do with the Postgresql database development, it’s about DI in session listener.
Blind guess, using quartz scheduler right? may be you can check this article http://www.mkyong.com/spring/spring-quartz-scheduler-example/
[...] Callback(Create):" + session.getId()); } Bean Definition Solution:Using the method used in link works. [...]
[...] Spring how to do dependency injection in your session listener [...]
You can integrate Quartz in Spring on Web application by using this example?
This is a generic solution for almost all of the framework. But, Spring also comes with API integrate Quartz easily, see this article – http://www.mkyong.com/spring/spring-quartz-scheduler-example/
[...] Spring – How to do dependency injection in your session listener (tags: grails injection java spring tomcat springframework listener session) [...]