Spring - 具有依赖注入的启动代码

时间:2015-01-15 01:11:01

标签: spring spring-mvc servlets dependency-injection javabeans

我正在使用spring-mvc框架开发一个简单的Web应用程序。

我的配置只有一个mvc-dispatcher Servlet,(org.springframework.web.servlet.DispatcherServlet),我所有的配置都在META-INF\mvc-dispatcher-servlet.xml;我没有application.xml

特别是mvc-dispatcher-servlet.xml自动装配所有豆子。

我想在我的Web应用程序启动时执行一段代码,这段代码需要一些我需要注入的bean。

我找到了实施WebApplicationInitializerServletContextListener的建议的所有示例。但对我来说问题是这两个接口都允许在我的主要唯一Servlet启动之前执行我的代码,因此,在此之前我的bean是自动连接的。

@WebListener
public class MyCustomListener implements ServletContextListener {

    @Autowired
    private MyBean myBean;

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        // I have tried the following to inject the beans:
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(sce.getServletContext());

        WebApplicationContextUtils
            .getRequiredWebApplicationContext(sce.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);

        WebApplicationContextUtils
            .getWebApplicationContext(sce.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);

        myBean.doStuff(); //NullPointerException
    }


    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}

我尝试使用WebApplicationContextUtilsSpringBeanAutowiringSupport之类的内容将我的依赖项注入Listener,但我的webapplication上下文始终为null;如果我没弄错的话,那是因为Spring的FrameworkServlet还没有读取mvc-dispatcher-servlet.xml并创建了webApplicationContext:

来自FrameworkServlet.initServletBean

// this code that create the WebapplicationContext
// is executed after my custom listener
this.webApplicationContext = initWebApplicationContext();

在我的情况下执行需要bean的代码的标准方法是什么(即只有一个处理所有配置的DispatcherServlet)?

修改

我的web.xml很标准:

<web-app ... >

    <display-name>Spring MVC Application</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

我尝试实现ApplicationListener<ContextRefreshedEvent>,但是当我启动服务器时,ContextRefreshedEvent永远不会被触发:

@WebListener
public class MyCustomListener implements ApplicationListener<ContextRefreshedEvent> { 

    @Autowired
    private MyBean myBean;

    // I don't know why this event is never fired?
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        myBean.doStuff();
    }
}

我应该在web.xml和/或mvc-dispatcher-servlet.xml中添加一个参数来触发事件吗?

1 个答案:

答案 0 :(得分:0)

在Spring上下文初始化之后,您似乎需要执行一些代码。而不是在它之前。您可以使用ContextRefreshedEvent的{​​{1}}事件。

  

公共类CustomInitializerClass实现   ApplicationListener {

ApplicationListener