javascript
Spring mvc 启动配置文件加载两遍问题
問題描述
在使用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的區別
想了解更多精彩內容請關注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Spring mvc 启动配置文件加载两遍问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 多线程下注入bean问题
- 下一篇: Junit 多线测试 问题