Spring Web Application:Post-DispatcherServlet初始化

时间:2013-06-19 15:28:28

标签: spring servlets spring-mvc initialization startup

我正在使用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 

根据我的研究,到目前为止,以下具有预期的效果:

  1. this answer扩展ContextLoaderListener /实施ServletContextListener
  2. the javaoc实施WebApplicationInitializer
  3. 我的bean成功使用@PostConstruct;我正在寻找一个Servlet或容器级钩子,它将在容器初始化和后处理bean之后执行。

4 个答案:

答案 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