我正在使用Spring 3.2 DispatcherServlet
。我正在寻找在DispatcherServlet
初始化完成后发生的初始化挂钩;标准的Spring解决方案或servlet解决方案。有什么建议吗?
作为参考,servlet启动后的最终日志记录语句如下。我希望我的初始化方法在configured successfully
log statement之后执行。
DEBUG o.s.w.s.DispatcherServlet - Published WebApplicationContext of servlet 'mySpringDispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.mySpringDispatcherServlet]
INFO o.s.w.s.DispatcherServlet - FrameworkServlet 'mySpringDispatcherServlet': initialization completed in 5000 ms
DEBUG o.s.w.s.DispatcherServlet - Servlet 'mySpringDispatcherServlet' configured successfully
根据我的研究,到目前为止,以下不具有预期的效果:
ContextLoaderListener
/实施ServletContextListener
。 WebApplicationInitializer
。@PostConstruct
;我正在寻找一个Servlet或容器级钩子,它将在容器初始化和后处理bean之后执行。 答案 0 :(得分:2)
根本问题是我无法覆盖final
方法HttpsServlet.init()
。我在@Override
中找到了一个附近DispatcherServlet.initWebApplicationContext
- 能够确保我的bean和上下文完全初始化的方法:
@Override protected WebApplicationContext initWebApplicationContext() { WebApplicationContext wac = super.initWebApplicationContext(); // do stuff with initialized Foo beans via: // wac.getBean(Foo.class); return result; }
答案 1 :(得分:1)
来自Spring的 Standard and Custom Events 。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextListener implements
ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("ApplicationContext was initialized or refreshed: "
+ event.getApplicationContext().getDisplayName());
}
}
初始化DispatcherServlet时会触发上述事件,例如打印时:
INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'ServletName': initialization completed in 1234 ms
答案 2 :(得分:0)
您可以在应用程序上下文中实现ApplicationListener<ContextStartedEvent>
。然后,将为您的根上下文调用此事件侦听器一次,并为每个 servlet上下文调用一次。
public class StartupListener implements ApplicationListener<ContextStartedEvent> {
public void onApplicationEvent(ContextStartedEvent event) {
ApplicationContext context = (ApplicationContext) event.getSource();
System.out.println("Context '" + context.getDisplayName() + "' started.");
}
}
如果在 servlet上下文中定义此侦听器,则应该只为servlet上下文调用一次。
答案 3 :(得分:0)
试试这个,改变你的端口号。 就我而言,我从 server.port=8001 更改为 server.port=8002