在使用spring mvc 启动的时候,用到了一个在程序启动时加载的配置方法init-method="initLoad",并启动多线程来做数据同步,但是在程序启动之后发现该方法的任务被执行了两次。后来经过测试发现自己的Spring配置文件被加载了两次。如果是定时任务,那么就会出现两个相同的定时任务,可能对程序的数据造成影响。
下面我们分析下什么情况下可能加载两次配置文件。
项目名称为:“ade3”
项目“ade3”部署在tomcat的webapps目录下
如上述配置就会加载两次web项目,所以导致初始化方法执行多次,导致数据不一致的情况。
tomcat中的server.xml 配置:
其实相当于tomcat发布了两个项目,两个项目的访问地址为:
如果项目部署在tomcat的/webapps 目录下,那么 Context 的 docBase=“”配置为空就可以了。
applicationContext.xml 和 spring-servlet.xml 可能都定义了系统启动加载初始化定时任务的bean。
这样就会在ContextLoaderListener加载applicationContext.xml时启动定时任务 DispatcherServer加载 spring-servlet.xml时也会启动定时任务。相当于加载了两遍bean。
问题就出在ContextLoaderListener和DispatcherServlet,他们都可以引入spring,而且每个引入都会实例化一次bean。如果把两个引入方式配置到同一个文件,那么就会导致一个bean被实例化两次。但是,当我们使用Spring Bean的时候,只会用到DispatcherServlet下的Bean,而不会用到ContextLoaderListener下的Bean,这就会导致ContextLoaderListener的bean不会被用到,而且也不会被内存回收到,产生内存泄漏。
ContextLoaderListener加载的spring配置文件中的内容不要和DispatcherServer中加载的spring配置文件的内容重叠。