javascript
Spring mvc 启动配置文件加载两遍问题
問題描述
在使用spring mvc 啟動的時(shí)候,用到了一個(gè)在程序啟動時(shí)加載的配置方法init-method=”initLoad”,并啟動多線程來做數(shù)據(jù)同步,但是在程序啟動之后發(fā)現(xiàn)該方法的任務(wù)被執(zhí)行了兩次。后來經(jīng)過測試發(fā)現(xiàn)自己的Spring配置文件被加載了兩次。如果是定時(shí)任務(wù),那么就會出現(xiàn)兩個(gè)相同的定時(shí)任務(wù),可能對程序的數(shù)據(jù)造成影響。
下面我們分析下什么情況下可能加載兩次配置文件。
情況一:web 項(xiàng)目被tomcat 加載兩次
項(xiàng)目名稱為:“ade3”
tomcat的/webapps 目錄:
項(xiàng)目“ade3”部署在tomcat的webapps目錄下
tomcat的server.xml配置文件,配置如下:
如上述配置就會加載兩次web項(xiàng)目,所以導(dǎo)致初始化方法執(zhí)行多次,導(dǎo)致數(shù)據(jù)不一致的情況。
web項(xiàng)目加載兩次原因
tomcat中的server.xml 配置:
1. 第一次加載:Host 的 appBase=“webapps” 這樣Tomcat在啟動的時(shí)候會把 tomcat/webapps目錄下的所有的項(xiàng)目加載并啟動。
2. 第二次加載:Context 的 docBase=“ade3” ,這樣tomcat會在查找docBase配置的項(xiàng)目,并加載。
其實(shí)相當(dāng)于tomcat發(fā)布了兩個(gè)項(xiàng)目,兩個(gè)項(xiàng)目的訪問地址為:
1. http://localhost:8080/ade3 (ade3為webapps目錄下的項(xiàng)目名)
2. http://localhost:8080/ade (ade為 Context的 path=”/ade”)
解決方法
如果項(xiàng)目部署在tomcat的/webapps 目錄下,那么 Context 的 docBase=“”配置為空就可以了。
情況二
- ContextLoaderListener加載applicationContext.xml 文件
- DispatcherServer加載 spring-servlet.xml 文件
applicationContext.xml 和 spring-servlet.xml 可能都定義了系統(tǒng)啟動加載初始化定時(shí)任務(wù)的bean。
這樣就會在ContextLoaderListener加載applicationContext.xml時(shí)啟動定時(shí)任務(wù)
DispatcherServer加載 spring-servlet.xml時(shí)也會啟動定時(shí)任務(wù)。相當(dāng)于加載了兩遍bean。
問題分析
問題就出在ContextLoaderListener和DispatcherServlet,他們都可以引入spring,而且每個(gè)引入都會實(shí)例化一次bean。如果把兩個(gè)引入方式配置到同一個(gè)文件,那么就會導(dǎo)致一個(gè)bean被實(shí)例化兩次。但是,當(dāng)我們使用Spring Bean的時(shí)候,只會用到DispatcherServlet下的Bean,而不會用到ContextLoaderListener下的Bean,這就會導(dǎo)致ContextLoaderListener的bean不會被用到,而且也不會被內(nèi)存回收到,產(chǎn)生內(nèi)存泄漏。
解決方法
ContextLoaderListener加載的spring配置文件中的內(nèi)容不要和DispatcherServer中加載的spring配置文件的內(nèi)容重疊。
使用ContextLoaderlistener和DispatcherServlet引入Spring的區(qū)別
想了解更多精彩內(nèi)容請關(guān)注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡書
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
以上是生活随笔為你收集整理的Spring mvc 启动配置文件加载两遍问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 多线程下注入bean问题
- 下一篇: gradle idea java ssm