FileSystemApplicationContext的繼承體系:
FileSystemXmlApplicationContext->AbstractXmlApplicationContext->AbstractRefreshableConfigApplicationContext->AbstractApplicationContext->DefaultResourceLoader->
protected final void refreshBeanFactory() throws BeansException{
//如果BeanFactory建立了,銷燬並關閉BeanFactory
if(hasBeanFactory()){
destroyFactory();
closeBeanFactory();
}
//創建並設置持有DefaultListableBeanFactory的地方調用loadBeanDefinition再載入BeanDefinition的信息
try{
DefaultListableBeanFactory beanFactory=createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);
synchronized(this.beanFactoryMonitor){
this.beanFactory=beanFactory;}
}catch(IOException ex){
throw new ApplicationContextException("IO error parsi
ng XML document for"+getDisplayName(),ex);}
}
protected DefaultListableBeanFactory createBeanFactory(){
return new DefaultListableBeanFactory(getInternalParentbeanFactory());}
//使用BeanDefinitionReader載入Bean定義的地方。
protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)throws IOException,BeansException;
public int loadBeanDefinitions(String location,Set actualResources) throws BeanDefinitionStoreException{
//取得ResourceLoader,使用的是DefaultResourceLoader
ResourceLoader resourceLoader=getResourceLoader();
if(resourceLoader==null){
throw new BeanDefinitionException("cant import bean definitions from location["+location+"]:no ResourecLoader available");
}
//對Resource路徑模式進行解析
if(resourceLoader instanceOf ResourcePatternResolver){
try{
//調用DefaultResourceLoader的getResource完成具體的Resource定位
Resource[] res=((ResourcePatternresolver) resourceLoader).getResources(location);
int loadCount=loadBeanDefinitions(resources);
if(ACTUALrESOURCES==NULL){
for(int i=0;i<resources.length;i++){
actualResources.add(resources[i]);
}}
if(logger.isDebugEnabled()){
logger.debug("Loaded"+loadcount+"bean definitions from location pattern["+location+"]");
}
return loadcount;
}catch(IOException ex){
throw new BeanDefinitionStoreException{
"couldnt resolve bean definition resource pattern["+location+"],ex"}
}else{
//調用DefaultResourceLoader的getResource完成Resource的定位
Resource resource=resourceLoader.getResource(location);
int loadCount=loadBeanDefinitions(resource);
if(actualResources!=null){
actualResources.add(resource);
return loadCount;}
}
}
}
1.BeanDefinition的Resource定位:
ClassPathResource res=new ClassPathResource(“beans.xml”);
;相當於打水找到水源。
取得resource的具體過程:
public Resource getResource(String location){
}
路徑模式是先找classpath路徑的resource,再找url的resource,兩者都沒有,就用getResourceByPath(location);