我有一个对象,该对象代表着具有大量数据的用户状态,并且每个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的方法?
答案 0 :(得分:0)
您可以使用全局ServletContextListener
。需要在bean级别注册回调,ServletContextListener
在context
级别注册回调。
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;
}