如何在Spring Web 4.3中持久保存HTTP请求上的对象

时间:2019-02-14 11:13:42

标签: java spring spring-mvc

我有一个对象,该对象代表着具有大量数据的用户状态,并且每个HTTP请求可以对该对象进行多次更改,因此,我要使用的一种优化方法是仅在HTTP请求销毁时持久保留该对象。 / p>

问题是,当我尝试在请求作用域bean上使用@PreDestroy批注时,由于DispatcherServlet重置了{{1}中的所有请求作用域bean,因此我无法使用http会话之类的请求作用域依赖性(例如,调用javax.servlet.http.HttpServletRequest#getSession())。 }

org.springframework.web.servlet.FrameworkServlet#processRequest

带有PreDestroy注释的方法通常用于释放它一直持有的资源,但是我想使用很多依赖来提交事务,这就是为什么它不起作用的原因。

Spring Web中有什么方法可以在Servlet :: doService调用之后并且在请求范围bean重置之前调用bean的方法?

1 个答案:

答案 0 :(得分:0)

您可以使用全局ServletContextListener。需要在bean级别注册回调,ServletContextListenercontext级别注册回调。

public class MyServletContextListener
  implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(
          "Executed callback ContextListener.");
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Triggers when context initializes
    }
}

您需要将其注册到配置类中的ServletListenerRegistrationBean

@Bean
ServletListenerRegistrationBean<ServletContextListener> servletListener() {
    ServletListenerRegistrationBean<ServletContextListener> srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new MyServletContextListener());
    return srb;
}