Spring - Как сделать внедрение зависимостей в слушателе сеанса
Spring поставляется с прослушивателем «ContextLoaderListener» для включения внедрения зависимостей Spring в прослушиватель сеанса. В этом руководстве он изменяет этотHttpSessionListener example, добавляя bean-компонент Spring для инъекции в прослушиватель сеанса.
1. Весенние бобы
Создайте простой счетчик службы для печати общего количества созданных сеансов.
Файл: CounterService.java
package com.example.common; public class CounterService{ public void printCounter(int count){ System.out.println("Total session created : " + count); } }
File : counter.xml - файл конфигурации Bean.
2. WebApplicationContextUtils
Использует «WebApplicationContextUtils
» для получения контекста Spring, а позже вы можете получить любой объявленный bean-компонент Spring обычным способом Spring.
Файл: SessionCounterListener.java
package com.example.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. интеграция
Единственная проблема заключается в том, как ваше веб-приложение знает, куда загрузить файл конфигурации бина Spring Секрет находится внутри файла «web.xml».
-
Зарегистрируйте «
ContextLoaderListener
» в качестве первого слушателя, чтобы ваше веб-приложение узнало о загрузчике контекста Spring. -
Настройте «
contextConfigLocation
» и определите файл конфигурации вашего компонента Spring.
Файл: web.xml
Archetype Created Web Application contextConfigLocation /WEB-INF/Spring/counter.xml org.springframework.web.context.ContextLoaderListener com.example.common.SessionCounterListener Spring DI Servlet Listener com.example.common.App Spring DI Servlet Listener /Demo
Файл: App.java
package com.example.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", "example.com"); session.invalidate(); //sessionDestroyed() is executed PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("Spring Dependency Injection into Servlet Listenner
"); out.println(""); out.println(""); } }
Запустите Tomcat и перейдите по URL-адресу «http://localhost:8080/SpringWebExample/Demo».
выход
sessionCreated - add one session into counter Total session created : 1 sessionDestroyed - deduct one session from counter Total session created : 0
Посмотрите выходные данные консоли, вы получите компонент службы счетчика через Spring DI и напечатаете общее количество сеансов.
Заключение
В Spring «ContextLoaderListener
» - это общий способ перехода кintegrate Spring Dependency Injection to almost all of the web application.