目前都配置了相同的bean,期望是以后能配置5個(gè)不同的數(shù)據(jù)源
1.在有5個(gè)項(xiàng)目配置了5個(gè)相同id的bean時(shí)
可以看到bean被覆蓋了4次锦积,只有一個(gè)bean生效
2.修改數(shù)據(jù)源datasourceBean的其中一個(gè)項(xiàng)目的BeanID芒帕,其余不變
所有該類型的bean在聲明時(shí)候被聲明為primary
發(fā)生異常,可以看到不同id的bean由于都被設(shè)置成primary導(dǎo)致異常
很容易理解,primary對(duì)于不同ID相同的Class實(shí)例來說只能有一個(gè)丰介,對(duì)于相同的ID實(shí)例則會(huì)直接覆蓋
3.修改數(shù)據(jù)源datasourceBean的其中一個(gè)項(xiàng)目的BeanID及不聲明為primary副签,其余不變,其余所有該類型的bean在聲明時(shí)候被聲明為primary
正常啟動(dòng)基矮,可以看到創(chuàng)建了兩個(gè)相同類型的實(shí)例
4.修改數(shù)據(jù)源datasourceBean的其中一個(gè)項(xiàng)目的Bean的Class及不聲明為primary,其余不變
其余所有該類型的bean在聲明時(shí)候被聲明為primary
可以看到發(fā)生覆蓋情況冠场,因此可以總結(jié)出
bean是否發(fā)生覆蓋只跟beanId有關(guān)而跟bean的類型無關(guān)
當(dāng)兩個(gè)相同的類型的bean都被配置成primary時(shí)會(huì)發(fā)生異常
當(dāng)需要配置多數(shù)據(jù)源時(shí)家浇,需要為每個(gè)子系統(tǒng)的bean配置不同的ID,以防發(fā)生覆蓋
下面再接著說一下Springboot對(duì).properties文件的讀取
我們知道在使用springboot的腳手架建立項(xiàng)目時(shí)默認(rèn)會(huì)有application.properties的配置文件
Springboot讀取.properties文件的讀取順序如下所示
其中需要注意的是Springboot對(duì)于同文件名只讀取一次碴裙,高優(yōu)先級(jí)覆蓋低優(yōu)先級(jí)
以上是錯(cuò)誤的解讀钢悲,實(shí)際上SpringBoot是對(duì)相同的屬性以先讀取的為主,文件仍然會(huì)讀取多次
如果上面的圖容易產(chǎn)生混亂的話看下面的順序就好理解了
通俗的說SpringBoot默認(rèn)只加載application-{profile}.properites
當(dāng)沒有指定Profile時(shí)會(huì)默認(rèn)加載application.properties文件
而當(dāng)指定了SpringBoot的Profile時(shí)則會(huì)默認(rèn)加載application-{profile}.properties文件
當(dāng)然也可以讓SpringBoot除了加載默認(rèn)文件以外也可以人為指定加載額外的properties文件
在我們的項(xiàng)目中則是通過這種方式進(jìn)行
這樣SpringBoot會(huì)去同時(shí)檢索application-{profile}和application文件
檢索順序如上面的圖所示
接下面我們進(jìn)行驗(yàn)證
配置兩個(gè)bean
第一個(gè)bean
這里的屬性通過主項(xiàng)目的application-dev.properties文件進(jìn)行注入
第二個(gè)bean
屬性通過子項(xiàng)目的application.properties文件進(jìn)行注入
子項(xiàng)目目錄結(jié)構(gòu)
可以看出并沒有符合規(guī)范結(jié)構(gòu)
我們讓主項(xiàng)目引用子項(xiàng)目的jar包
運(yùn)行結(jié)果
啟動(dòng)報(bào)錯(cuò)舔株,沒有讀取成功
接下來我們修改子項(xiàng)目的結(jié)構(gòu)
可以看到現(xiàn)在已經(jīng)符合規(guī)范結(jié)構(gòu)莺琳,重新打包編譯再進(jìn)行驗(yàn)證
正常啟動(dòng),說明此時(shí)屬性注入正常,application.properties被成功讀取
然后我們修改application.properties文件名為application-dev
預(yù)期結(jié)果會(huì)出現(xiàn)覆蓋現(xiàn)象
正常啟動(dòng)载慈,打臉了惭等,翻閱資料發(fā)現(xiàn)
文件的讀取是多次的,對(duì)相同的屬性值來說以先讀取的為標(biāo)準(zhǔn)办铡,但是不同的屬性依然可以正常讀取
通過驗(yàn)證發(fā)現(xiàn)辞做,想要在子項(xiàng)目配置多個(gè)子項(xiàng)目的情況下每個(gè)項(xiàng)目想引用不同的數(shù)據(jù)源首先需要保證
1.每個(gè)子項(xiàng)目必須配置不同ID的bean琳要,否則出現(xiàn)覆蓋現(xiàn)象,需要注意的是各個(gè)子系統(tǒng)中的sqlSessionFactiory所指定的mapper.xml路徑不要出現(xiàn)重復(fù)秤茅,否則會(huì)造成一條SQL被多個(gè)bean命中切面
2.子系統(tǒng)所指定的.properties文件中與主系統(tǒng).properties文件名相同時(shí)稚补,若出現(xiàn)相同屬性,以先讀取的為主
3.除非特殊設(shè)置讀取路徑框喳,否則需要按照規(guī)范放在指定路徑下容器才能讀取properties文件