Spring HttpSessionListener实现内部的依赖项注入
问题:此注入依赖项将始终从Spring HttpSessionListener实现内部的依赖项注入,spring,servlets,web-applications,dependency-injection,web.xml,Spring,Servlets,Web Applications,Dependency Injection,Web.xml,问题:此注入依赖项将始终从SimpleController返回0 为什么在尝试向HttpSessionListener实现中注入依赖项时会丢失这个bean的上下文 这背后的原则是什么?我是否遗漏/混淆了这一点 我该如何解决这个问题 Github上的项目 考虑以下几点: SessionCounterListener public class SessionCounterListener implements HttpSessionListener { @Autowired private
SimpleController返回0
public class SessionCounterListener implements HttpSessionListener {
@Autowired
private SessionService sessionService;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
sessionService.addOne();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
sessionService.removeOne();
}
}
@Component
public SimpleController
{
@Autowired
private SessionService sessionService;
@RequestMapping(value="/webAppStatus")
@ResponseBody
public String getWebAppStatus()
{
return "Number of sessions: "+sessionService.getTotalSessions();
}
}
web.xml
<web-app ...>
<listener>
<listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
</listener>
</web-app>
控制器:SimpleController
public class SessionCounterListener implements HttpSessionListener {
@Autowired
private SessionService sessionService;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
sessionService.addOne();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
sessionService.removeOne();
}
}
@Component
public SimpleController
{
@Autowired
private SessionService sessionService;
@RequestMapping(value="/webAppStatus")
@ResponseBody
public String getWebAppStatus()
{
return "Number of sessions: "+sessionService.getTotalSessions();
}
}
当您在web.xml中声明
时
<listener>
<listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
</listener>
不是web.xml
中的有效条目。我不知道这是否是您的复制错误。当您在web.xml中声明
时
<listener>
<listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
</listener>
不是
web.xml
中的有效条目。我不知道这是否是您的复制错误。这是一个答案,显示了实际的解决方案
您应该像这样修改SessionCountListener,上面的示例将起作用:
public class SessionCounterListener implements HttpSessionListener {
@Autowired
private SessionService sessionService;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
getSessionService(se).addOne();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
getSessionService(se).removeOne();
}
private SessionService getSessionService(HttpSessionEvent se) {
WebApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(
se.getSession().getServletContext());
return (SessionService) context.getBean("sessionService");
}
}
这是一个显示实际解决方案的答案 您应该像这样修改SessionCountListener,上面的示例将起作用:
public class SessionCounterListener implements HttpSessionListener {
@Autowired
private SessionService sessionService;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
getSessionService(se).addOne();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
getSessionService(se).removeOne();
}
private SessionService getSessionService(HttpSessionEvent se) {
WebApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(
se.getSession().getServletContext());
return (SessionService) context.getBean("sessionService");
}
}
@stackoverflow请参阅解决方法。您不一定需要将其从web.xml中删除。如果这样做,则需要以不同的方式注册它(请参见
ServletContext
、ServletContainerInitializer
和WebApplicationInitializer
)。否则,您只需从ServletContext
属性中获取当前的WebApplicationContext
。因此,如果您理解您的“解决方法”链接提供的答案,请与我联系。基本上,只需从web.xml中删除侦听器并实现ServletContextListener接口(使用适当的Annation)。我应该准备好了吗?@stack No.ServletContextListener
与HttpSessionListener
(请参阅javadoc)的用途不同,但它们的注册方式相同,即
。在第二个链接中,它展示了如何使用WebApplicationListener
。该接口允许您访问ServletContext
,在那里您可以通过编程注册一个侦听器。由于您可以访问Spring上下文,您可以让它提供一个SessionCounterListener
bean并注册它。@stackoverflow不要混淆web.xml
和Spring上下文文件,它们以
声明开头<代码>是在Spring上下文文件中使用的Spring元素,而不是在web部署描述符中使用的。获取上下文的唯一方法是,如果我调用的每个DI实例都是SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(此);这似乎是一种可怕、笨拙的做法。现在,为了让事情顺利进行,我在整个项目中(在requestMappings上)进行了大约8次不同的调用@stackoverflow查看解决方法。您不一定需要将其从web.xml中删除。如果这样做,则需要以不同的方式注册它(请参见ServletContext
、ServletContainerInitializer
和WebApplicationInitializer
)。否则,您只需从ServletContext
属性中获取当前的WebApplicationContext
。因此,如果您理解您的“解决方法”链接提供的答案,请与我联系。基本上,只需从web.xml中删除侦听器并实现ServletContextListener接口(使用适当的Annation)。我应该准备好了吗?@stack No.ServletContextListener
与HttpSessionListener
(请参阅javadoc)的用途不同,但它们的注册方式相同,即
。在第二个链接中,它展示了如何使用WebApplicationListener
。该接口允许您访问ServletContext
,在那里您可以通过编程注册一个侦听器。由于您可以访问Spring上下文,您可以让它提供一个SessionCounterListener
bean并注册它。@stackoverflow不要混淆web.xml
和Spring上下文文件,它们以
声明开头<代码>是在Spring上下文文件中使用的Spring元素,而不是在web部署描述符中使用的。获取上下文的唯一方法是,如果我调用的每个DI实例都是SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(此);这似乎是一种可怕、笨拙的做法。所以现在为了让事情顺利进行,我在整个项目中(在requestMappings上)打了8次电话