亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Spring IOC 源碼閱讀之資源定位加載

2019-11-11 05:25:31
字體:
來源:轉載
供稿:網友

關于sPRing容器的啟動的主要的入口是AbstractapplicationContext的refresh()方法,這個方法非常重要;

[html] view plain copy public void refresh() throws BeansException, IllegalStateException {      synchronized (this.startupShutdownMonitor) {          // Prepare this context for refreshing.          prepareRefresh();            // Tell the subclass to refresh the internal bean factory.          ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();            // Prepare the bean factory for use in this context.          prepareBeanFactory(beanFactory);            try {              // Allows post-processing of the bean factory in context subclasses.              postProcessBeanFactory(beanFactory);                // Invoke factory processors registered as beans in the context.              invokeBeanFactoryPostProcessors(beanFactory);                // Register bean processors that intercept bean creation.              registerBeanPostProcessors(beanFactory);                // Initialize message source for this context.              initMessageSource();                // Initialize event multicaster for this context.              initApplicationEventMulticaster();                // Initialize other special beans in specific context subclasses.              onRefresh();                // Check for listener beans and register them.              registerListeners();                // Instantiate all remaining (non-lazy-init) singletons.              finishBeanFactoryInitialization(beanFactory);                // Last step: publish corresponding event.              finishRefresh();          }            catch (BeansException ex) {              // Destroy already created singletons to avoid dangling resources.              destroyBeans();                // Reset 'active' flag.              cancelRefresh(ex);                // Propagate exception to caller.              throw ex;          }      }  }        此方法中用obtainFreshBeanFactory方法間接的調用了子類(如AbstractRefreshableApplicationContext)實現的refreshBeanFctory()方法。[java] view plain copy /**      * This implementation performs an actual refresh of this context's underlying      * bean factory, shutting down the previous bean factory (if any) and      * initializing a fresh bean factory for the next phase of the context's lifecycle.      */      @Override      protected final void refreshBeanFactory() throws BeansException {          if (hasBeanFactory()) {              destroyBeans();              closeBeanFactory();          }          try {              DefaultListableBeanFactory beanFactory = createBeanFactory();              beanFactory.setSerializationId(getId());              customizeBeanFactory(beanFactory);              loadBeanDefinitions(beanFactory);              synchronized (this.beanFactoryMonitor) {                  this.beanFactory = beanFactory;              }          }          catch (IOException ex) {              throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);          }      }       refreshBeanFctory()首先實例化一個BeanFactory(DefaultListableBeanFactory),然后調用抽象方法loadBeanDifinition(DefaultListableBeanFactory beanFactory),此方法由其子類實現,比如AbstractxmlApplicationContext、XmlWebApplicationContext等。[java] view plain copy protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {      // Create a new XmlBeanDefinitionReader for the given BeanFactory.      XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);        // Configure the bean definition reader with this context's      // resource loading environment.      beanDefinitionReader.setEnvironment(this.getEnvironment());      beanDefinitionReader.setResourceLoader(this);      beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));        // Allow a subclass to provide custom initialization of the reader,      // then proceed with actually loading the bean definitions.      initBeanDefinitionReader(beanDefinitionReader);      loadBeanDefinitions(beanDefinitionReader);  }  在這個方法中,做了以下事情:1、首先創建了一個BeanDefinitionReader的實例(XmlBeanDefinitionReader), [java] view plain copy XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);  2、設置ResorceLoader為ApplicationContext實例本身(實際上是繼承了DefaultResourceLoader,所以其實這里的ResourceLoader是DefaultResourceLoader),[java] view plain copy beanDefinitionReader.setResourceLoader(this);    3、調用loadBeanDefinitions(XmlBeanDefinitionReader reader)方法。 [java] view plain copy    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {  Resource[] configResources = getConfigResources();  if (configResources != null) {      reader.loadBeanDefinitions(configResources);  }  String[] configLocations = getConfigLocations();  if (configLocations != null) {      reader.loadBeanDefinitions(configLocations);  }  這個方法調用父類AbstractRefreshableConfigApplication的getConfigLocations方法,獲取資源定義的路徑,如果不是通過構造器傳入的路徑,則調用getDefaultConfigLocations的子類實現來獲取資源定義路徑(XmlWebApplicationContext)。然后調用BeanDefinitionReader的loadBeanDefinitions(String location)方法加載資源。[java] view plain copy public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException {      ResourceLoader resourceLoader = getResourceLoader();      if (resourceLoader == null) {          throw new BeanDefinitionStoreException(                  "Cannot import bean definitions from location [" + location + "]: no ResourceLoader available");      }        if (resourceLoader instanceof ResourcePatternResolver) {          // Resource pattern matching available.          try {              Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);              int loadCount = loadBeanDefinitions(resources);              if (actualResources != null) {                  for (Resource resource : resources) {                      actualResources.add(resource);                  }              }              if (logger.isDebugEnabled()) {                  logger.debug("Loaded " + loadCount + " bean definitions from location pattern [" + location + "]");              }              return loadCount;          }          catch (IOException ex) {              throw new BeanDefinitionStoreException(                      "Could not resolve bean definition resource pattern [" + location + "]", ex);          }      }      else {          // Can only load single resources by absolute URL.只能加載一個絕對路徑的URL資源          Resource resource = resourceLoader.getResource(location);          int loadCount = loadBeanDefinitions(resource);          if (actualResources != null) {              actualResources.add(resource);          }          if (logger.isDebugEnabled()) {              logger.debug("Loaded " + loadCount + " bean definitions from location [" + location + "]");          }          return loadCount;      }  }  在BeanDefinitionReader的loadBeanDefinitions的方法中,首先獲取前面setter的ResourceLoader對象,調用ResourseLoader對象的getResources(location)方法(這個方法會根據location判斷是否是classpathResource或者URL,如果都不是調用getResourceByPath(由子類FileSystemXmlApplicationContext或AbstractRefreshableWebApplicationContext等實現返回FileSystemResource或者ServletContextResource))獲取具體的資源Resource。[java] view plain copy public Resource getResource(String location) {      Assert.notNull(location, "Location must not be null");      if (location.startsWith(CLASSPATH_URL_PREFIX)) {          return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());      }      else {          try {              // Try to parse the location as a URL...              URL url = new URL(location);              return new UrlResource(url);          }          catch (MalformedURLException ex) {              // No URL -> resolve as resource path.              return getResourceByPath(location);          }      }  }  FileSystemXmlApplication:[java] view plain copy        protected Resource getResourceByPath(String path) {  if (path != null && path.startsWith("/")) {      path = path.substring(1);  }  return new FileSystemResource(path);  AbstractRefreshableWebApplicationContext:[java] view plain copy protected Resource getResourceByPath(String path) {          return new ServletContextResource(this.servletContext, path);      } 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久日本电影| 在线观看日韩www视频免费| 久久人体大胆视频| 亚洲视频专区在线| 日本一本a高清免费不卡| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产亚洲精品久久久久动| 国模极品一区二区三区| 日韩欧美大尺度| 亚洲天堂久久av| 欧美日韩一区二区三区| 久久亚洲成人精品| 亚洲午夜国产成人av电影男同| 不卡毛片在线看| 国产日韩在线观看av| 另类少妇人与禽zozz0性伦| 91夜夜未满十八勿入爽爽影院| 欧美精品激情在线| 久久亚洲国产精品| 欧美激情在线狂野欧美精品| 热99久久精品| 日韩精品日韩在线观看| 日韩在线观看免费全集电视剧网站| 亚洲成人a**站| 91精品啪在线观看麻豆免费| 午夜精品蜜臀一区二区三区免费| 久久久免费电影| 日韩欧美在线中文字幕| 欧美性理论片在线观看片免费| 亚洲精品国产精品自产a区红杏吧| 日本精品久久电影| 国产成人精品视| 欧美野外猛男的大粗鳮| 亚洲深夜福利视频| 国产欧美亚洲视频| 国产精品ⅴa在线观看h| 国产精品69精品一区二区三区| 亚洲色图欧美制服丝袜另类第一页| 亚洲成人久久电影| 久久国内精品一国内精品| 一区二区国产精品视频| 91av视频在线| 日韩女优在线播放| 精品国产自在精品国产浪潮| 日韩欧美在线看| 中文在线不卡视频| 伊人精品在线观看| 亚洲最大成人网色| 91精品在线播放| 国产精品久久久久久久7电影| 久久久久久久久久久免费精品| 91精品国产91久久久久久不卡| 亚洲第一福利网| 国产精品成av人在线视午夜片| 久久久久国产精品免费| 亚洲成人精品久久久| 成人有码视频在线播放| 91精品视频播放| 97在线观看视频国产| 亚洲黄色免费三级| 日产精品久久久一区二区福利| 久久精品99久久香蕉国产色戒| 欧美精品在线播放| 亚洲一区亚洲二区亚洲三区| 国产午夜精品理论片a级探花| 亚洲综合第一页| 亚洲最大成人网色| 久久精品国产v日韩v亚洲| 亚洲成在人线av| 97视频在线播放| 精品久久久国产精品999| 91在线无精精品一区二区| 国产精品网红福利| 国产精品网站大全| 久热在线中文字幕色999舞| 久久久精品影院| 欧美性高跟鞋xxxxhd| 亚洲精品欧美日韩| 亚洲一区二区久久久久久久| 久久99精品久久久久久噜噜| 亚洲综合视频1区| 国产精品高清网站| 5566日本婷婷色中文字幕97| 国产精品白嫩初高中害羞小美女| 亚洲成av人片在线观看香蕉| 久久久久久这里只有精品| 中文字幕亚洲一区二区三区五十路| 久久久久久久久网站| 欧美成人一区在线| 国产成人精品日本亚洲| 亚洲qvod图片区电影| 亚洲色图日韩av| 国产欧美精品一区二区三区介绍| 98精品国产高清在线xxxx天堂| 在线观看精品自拍私拍| 国产精品视频一区二区高潮| 欧美夜福利tv在线| 日韩精品极品视频| 91在线看www| 欧美视频在线观看 亚洲欧| 奇门遁甲1982国语版免费观看高清| 欧美大片在线看| 68精品国产免费久久久久久婷婷| 亚洲人午夜精品| 国产视频久久久久| 91久久久久久国产精品| 久久久人成影片一区二区三区观看| 欧美另类高清videos| 国内精品视频久久| 亚洲午夜av久久乱码| 日韩色av导航| 国产91精品久| 国产欧美日韩视频| 中文字幕日韩电影| 日韩在线视频观看正片免费网站| 成人有码在线视频| 欧美老女人在线视频| 日韩视频在线观看免费| 91国偷自产一区二区三区的观看方式| 日韩av免费看网站| 伊是香蕉大人久久| 欧美色另类天堂2015| 亚洲肉体裸体xxxx137| 国产成人中文字幕| 亚洲韩国日本中文字幕| 国产午夜精品一区理论片飘花| 国产成人一区二区三区电影| 乱亲女秽乱长久久久| 中文字幕av一区中文字幕天堂| 精品福利在线观看| 久久视频在线直播| 一本一本久久a久久精品牛牛影视| 黑人与娇小精品av专区| 国产a∨精品一区二区三区不卡| 国产精品丝袜久久久久久不卡| www国产91| 色综合久久久久久中文网| 久久成人在线视频| 在线成人中文字幕| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品少妇一区二区30p| 精品香蕉一区二区三区| 日韩欧美亚洲国产一区| 日韩美女视频免费在线观看| 欧美丰满老妇厨房牲生活| 亚洲大胆人体在线| 日韩欧美黄色动漫| 国产精品久久综合av爱欲tv| 欧美成人全部免费| 日韩欧美在线视频免费观看| 日韩精品www| 岛国av午夜精品| 国产成人精品视频在线观看| 91精品成人久久| 2021国产精品视频| 精品网站999www| 欧美专区在线观看| 亚洲国产精品va在线观看黑人| 57pao成人国产永久免费| 亚洲国产精品久久精品怡红院| 国产精品美女在线观看| 成人xvideos免费视频| 欧美日韩在线视频一区| 亚洲人成在线观|