Spring –セッションリスナーで依存性注入を行う方法
Springには「ContextLoaderListener」リスナーが付属しており、セッションリスナーへのSpring依存性注入を有効にします。 このチュートリアルでは、Spring依存性注入Beanをセッションリスナーに追加することにより、このHttpSessionListener exampleを修正します。
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のコンテキストを取得します。後で、宣言されたSpringのBeanを通常の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. 統合
唯一の問題は、WebアプリケーションがSpring Bean構成ファイルをロードする場所をどのように知るかです。 秘密は「web.xml」ファイル内にあります。
-
「
ContextLoaderListener
」を最初のリスナーとして登録して、WebアプリケーションにSpringコンテキストローダーを認識させます。 -
「
contextConfigLocation
」を構成し、SpringのBean構成ファイルを定義します。
ファイル: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を介してカウンターサービスBeanを取得し、セッションの合計数を出力します。
結論
Springでは、「ContextLoaderListener
」はintegrate Spring Dependency Injection to almost all of the web applicationへの一般的な方法です。