Spring mvc 启动配置文件加载两遍问题
2017-10-31 23:21
190 查看
问题描述
在使用spring mvc 启动的时候,用到了一个在程序启动时加载的配置方法init-method=”initLoad”,并启动多线程来做数据同步,但是在程序启动之后发现该方法的任务被执行了两次。后来经过测试发现自己的Spring配置文件被加载了两次。如果是定时任务,那么就会出现两个相同的定时任务,可能对程序的数据造成影响。下面我们分析下什么情况下可能加载两次配置文件。
情况一:web 项目被tomcat 加载两次
项目名称为:“ade3”tomcat的/webapps 目录:
项目“ade3”部署在tomcat的webapps目录下
tomcat的server.xml配置文件,配置如下:
如上述配置就会加载两次web项目,所以导致初始化方法执行多次,导致数据不一致的情况。
web项目加载两次原因
tomcat中的server.xml 配置:1. 第一次加载:Host 的 appBase=“webapps” 这样Tomcat在启动的时候会把 tomcat/webapps目录下的所有的项目加载并启动。
2. 第二次加载:Context 的 docBase=“ade3” ,这样tomcat会在查找docBase配置的项目,并加载。
其实相当于tomcat发布了两个项目,两个项目的访问地址为:
1. http://localhost:8080/ade3 (ade3为webapps目录下的项目名)
2. http://localhost:8080/ade (ade为 Context的 path=”/ade”)
解决方法
如果项目部署在tomcat的/webapps 目录下,那么 Context 的 docBase=“”配置为空就可以了。情况二
ContextLoaderListener加载applicationContext.xml 文件
DispatcherServer加载 spring-servlet.xml 文件
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配置文件的内容重叠。使用ContextLoaderlistener和DispatcherServlet引入Spring的区别
ContextLoaderListener和DispatcherServlet都会生成一个WebApplicationContext(上下文),分别以不同的name存放在容器中。同一个容器里,只允许有一个ContextLoaderListener但是可以用多个DispatcherServlet。 DispatcherServlet的context总是ContextLoaderListener的context的子类。
在获取bean的时候,会先从DispatcherServlet的context获取,如果没有再从ContextLoaderListener的context获取,这就解释了上面的第一点。
如果两者用的是同一份配置文件,或者他们的定义bean有交叉就会造成部分bean永远不会被用到(泄漏)。
DispatcherServlet还会加载与SpringMVC相关的bean,如RequestMapping…
想了解更多精彩内容请关注我的公众号
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
相关文章推荐
- Tomcat启动项目时加载了两遍Spring配置文件
- ubuntu重新加载samb配置文件的一些问题
- dll文件加载运行加载的14001错误,由于应用程序配置不正确,应用程序未能启动
- 加载配置文件时的路径问题
- eclipse配置tomcat的问题,不能加载配置文件!
- 关于H3C路由器、交换机跳过配置文件启动的问题
- 解决 Silverlight 调用 WCF 服务 跨域访问 和 Silverlight 引用服务后配置文件不加载的问题
- hbase进行osgi bundle化以后配置文件加载问题
- win7 启动报错:user profile service服务不能登录无法加载用户配置文件
- flex application中预加载配置文件需要注意的问题
- 如何排查sharepoint2010用户配置文件同步服务启动问题
- XP系统启动时总是提示不能加载配置文件
- hbase进行osgi bundle化以后配置文件加载问题
- 关于Assembly.CreateInstance中被启动对象读取配置文件的问题
- 关于VS2008单元测试中加载配置文件的问题
- win2003启动无法加载本地配置文件的修复办法
- 庖丁配置文件加载问题PaodingAnalysisException
- 关于VS2008单元测试中加载配置文件的问题
- 关于php.ini配置文件不能加载的问题
- jvm的内存配置 eclipse.ini文件配置 eclipse的启动问题