Spring在org.springframework.web.context.ContextLoaderListener和org.springframework.web.servlet.DispatcherServlet中会产生两个Context,这个会导致某些需要Singleton的类产生两个实例,有时候会产生逻辑上的错误,比如定时器会执行两次。
经过测试发现可以继承DispatcherServlet,使DispatcherServlet不再产生新的Context,而是直接引用ContextLoaderListener产生的Context就能保证整个环境中只有一个Context,IoC的Bean就可以保证单例。
代码如下:
package wfc.service.util.spring;
import org.springframework.beans.BeansException;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class SingleContextDispatcherServlet extends DispatcherServlet {
private static final long serialVersionUID = 1L;
protected WebApplicationContext createWebApplicationContext(
WebApplicationContext parent) throws BeansException {
return parent;
}
}
web.xml改成如下:
<servlet>
<servlet-name>appDispatcherServlet</servlet-name>
<servlet-class>coral.base.app.AppDispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>