spring 技术内幕--IOC初始化过程深入之BeanDefinition的定位

来源:互联网 发布:淘宝收藏大师效果好么 编辑:程序博客网 时间:2024/06/05 20:29

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 parsing 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
原创粉丝点击