Springを使用し、context.getBean("foo-bar")
のように呼び出しなしで、依存性をHttpSessionListenerに注入する方法は?
サーブレット3.0ServletContextには「addListener」メソッドがあるため、web.xmlファイルにリスナーを追加する代わりに、次のようなコードを使用して追加できます。
@Component
public class MyHttpSessionListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (applicationContext instanceof WebApplicationContext) {
((WebApplicationContext) applicationContext).getServletContext().addListener(this);
} else {
//Either throw an exception or fail gracefully, up to you
throw new RuntimeException("Must be inside a web application context");
}
}
}
つまり、通常どおり「MyHttpSessionListener」に挿入できます。これにより、アプリケーションコンテキストにBeanが存在するだけで、リスナーがコンテナに登録されます。
SpringコンテキストでHttpSessionListener
をBeanとして宣言し、委任プロキシをweb.xml
の実際のリスナーとして次のように登録できます。
public class DelegationListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
ApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(
se.getSession().getServletContext()
);
HttpSessionListener target =
context.getBean("myListener", HttpSessionListener.class);
target.sessionCreated(se);
}
...
}
Spring 4.0で動作しますが、3でも動作します。以下に詳述する例を実装し、ApplicationListener<InteractiveAuthenticationSuccessEvent>
をリッスンし、HttpSession
を挿入しました https://stackoverflow.com/a/19795352/2213375