我正在使用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。
我找到了实施WebApplicationInitializer
或ServletContextListener
的建议的所有示例。但对我来说问题是这两个接口都允许在我的主要唯一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) {
}
}
我尝试使用WebApplicationContextUtils
或SpringBeanAutowiringSupport
之类的内容将我的依赖项注入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
中添加一个参数来触发事件吗?
答案 0 :(得分:0)
在Spring上下文初始化之后,您似乎需要执行一些代码。而不是在它之前。您可以使用ContextRefreshedEvent
的{{1}}事件。
公共类CustomInitializerClass实现 ApplicationListener {
ApplicationListener