spring 技術內幕--IOC初始化過程深入之BeanDefinition的定位

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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章