日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring mvc 启动配置文件加载两遍问题

發(fā)布時(shí)間:2024/9/30 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring mvc 启动配置文件加载两遍问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題描述

在使用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ū)別

  • ContextLoaderListener和DispatcherServlet都會生成一個(gè)WebApplicationContext(上下文),分別以不同的name存放在容器中。
  • 同一個(gè)容器里,只允許有一個(gè)ContextLoaderListener但是可以用多個(gè)DispatcherServlet。 DispatcherServlet的context總是ContextLoaderListener的context的子類。
  • 在獲取bean的時(shí)候,會先從DispatcherServlet的context獲取,如果沒有再從ContextLoaderListener的context獲取,這就解釋了上面的第一點(diǎn)。
  • 如果兩者用的是同一份配置文件,或者他們的定義bean有交叉就會造成部分bean永遠(yuǎn)不會被用到(泄漏)。
  • DispatcherServlet還會加載與SpringMVC相關(guān)的bean,如RequestMapping…

  • 想了解更多精彩內(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

    與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的Spring mvc 启动配置文件加载两遍问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。