如何使用 Spring 将依赖项注入 HttpSessionListener?

Posted

技术标签:

【中文标题】如何使用 Spring 将依赖项注入 HttpSessionListener?【英文标题】:How to inject dependencies into HttpSessionListener, using Spring? 【发布时间】:2011-01-26 20:39:05 【问题描述】:

如何在没有调用的情况下使用 Spring 将依赖项注入 HttpSessionListener,例如 context.getBean("foo-bar")

【问题讨论】:

【参考方案1】:

由于 Servlet 3.0 ServletContext 有一个“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 在您的应用程序上下文中存在,就会导致侦听器注册到容器中

【讨论】:

因此,通过这种方法,您能否从 web.xml 中的 部分中完全删除“MyHttpSessionListener”? 是的,没错。使用这种方法,您甚至不需要 web.xml。 在 Spring 5.x 中你不需要 ApplicationContextAware 接口。 @component 正在注册监听器,看起来很好。【参考方案2】:

您可以在 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本身没有这样的DelegationListener。 这不能与 DelegatingFilterProxy 一起工作的一个原因是无法从 web.xml 传递参数。你最终不得不假设一个 bean 名称,然后你只能支持一个委托监听器(除非有一种我没有看到的方法)。 这是一个很好的答案!【参考方案3】:

使用 Spring 4.0 但也适用于 3,我实现了下面详述的示例,监听 ApplicationListener<InteractiveAuthenticationSuccessEvent> 并注入 HttpSession https://***.com/a/19795352/2213375

【讨论】:

以上是关于如何使用 Spring 将依赖项注入 HttpSessionListener?的主要内容,如果未能解决你的问题,请参考以下文章

Spring:所有依赖项注入的类型

Spring使用Setter依赖注入

学习Spring IoC

如何使用 Xamarin 和 Autofac 将构造函数依赖项注入 ViewModel?

Kotlin Spring Boot 单元测试 - 添加 @TestExecutionListeners 不会注入依赖项

如何将依赖项注入 iOS 视图控制器?