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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值