這是SpringIOC初始化的第一步,找到水
當我們以編程的方式去使用Factory時(shí),首先會(huì )定義一個(gè)對象的Resource來(lái)定位要使用的BeadnDefinition,這時(shí)我們使用的是ClassPathResouce,這就以為著(zhù),這個(gè)Resource會(huì )類(lèi)路徑去尋找這個(gè)xml文件,雖然說(shuō)Resource是資源的意思,但是這不意味著(zhù)DefaultListableFacory能夠直接使用這個(gè)Resource資源,這個(gè)資源是要被經(jīng)過(guò)凈化的呢,Spring通過(guò)BeanDefinitionReader對這些Resource資源進(jìn)行一些處理,這時(shí)我們就可以跟明顯的看到直接使用ApplicationContext的好處了,applicationContext里面已經(jīng)有很多加載不同Resource的Reader的實(shí)現,而如果直接使用DefaultListableBeanFactory的話(huà)需要為他配置特定的ResourceReader才能完成相應的功能,當然么有絕對的利弊,直接使用DefaultListableFactory更具有靈活性。
回到我們經(jīng)常使用的ApplicationContext中,例如FileSystemXmlApplicationContext,ClassPathXmlApplication以及XmlWebApplicationContext中,我們很簡(jiǎn)單的能從他們的名字就能看到FileSystem使用文件系統中尋找的Resource,ClassPath是直接從類(lèi)路徑去尋找文件的載入Resource,webXml是直接從網(wǎng)上載入Resource
我們以文件系統為例分析如何完成定位的,
FileSystemXmlApplicationContext中有好多個(gè)構造器,最大的,最長(cháng)的構造有三個(gè)參數
其余的分別是一個(gè)或者是兩個(gè)參數,都是調用了最大的參數構造器,這個(gè)構造是這樣的
public FileSystemXmlApplicationContext(String[] configLOcation, boolean refresh, ApplicationContext parent){
super(parent);
setConfigLocation(configLOcation);
If(refresh){refresh()}
}
我們可以清楚的看到該方法有三個(gè)作用:①設置父類(lèi)容器 ②設置資源路徑 ③調用初始化方法
該類(lèi)中還有另一個(gè)方法getResourceByPath()
Protect Resorce getResourceByPath(String path){
If(path!=null && path.startWith(“/”)){path=path.subString(1) }
Return new FileSystemResource(path);
}
該方法在BeanDefanitionReader中被調用采用了模板的形式具體的定位在各個(gè)子類(lèi)實(shí)現返回某種類(lèi)型的Resource
咨詢(xún)熱線(xiàn)
010-85377344
135-21581588
微信客服
QQ客服
3026106565 點(diǎn)擊咨詢(xún)