不知道大家的項目中有沒有遇見過這種情況。
項目中總共有A.B.C三個module。A有三個spring配置文件,分別叫做bean.xml,service.xml,db.xml。然后B有兩個配置文件,分別叫做service.xml,bean.xml。然后啟動項目,spring加載時卻發現本在A的service.xml中定義的serviceForA死活實例化不了。而且即使你把serviceForA的配置刪掉,并且把項目中引用到的地方全部刪掉,又會發現spring報service.xml中有別的bean無法實例化。
最近我就遇見了這種近乎無解的問題。最后發現引起這種問題可能的原因是,spring為A實例化bean,事實上卻沒有加載A下面的service.xml,而是加載了B下面的service.xml!!!!我當時解壓了項目A打成的jar包,發現A項目下的service.xml文件內容與IDE里的內容完全不一樣,反而是和B的service.xml長得一樣。
深層次分析原因,發現A項目的pom.xml中添加了對B項目的依賴,所以可能spring在加載配置文件的時候,因為對B有依賴,所以決定先去實例化B的bean,先讀取到了B項目下面的service.xml文件,然后放到了A的配置文件集合(這是我自己YY的一個概念)中,等讀到A項目下的service.xml后,發現已經存在一個名為service.xml的文件,于是不再加載A下面本來的service.xml。于是導致了這個坑了我三天的問題。
解決方案很簡單,就是把A項目的service.xml給改個名字,改成serice-A.xml后,重新打包,再去解壓jar包,發現config/spring/下果然多了個service-A.xml,諷刺的是service.xml依然安安靜靜地躺在那。╮(╯▽╰)╭
總之,得到的教訓是盡量不要起重復名字的配置文件,即使這兩個文件放在不同的module中!
新聞熱點
疑難解答