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

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

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

2019-11-11 04:50:19
字體:
來源:轉載
供稿:網友

關于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);      } 
上一篇:delegate vs event

下一篇:KMP探索

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久不口人| 91豆花精品一区| 欧美日韩在线视频一区二区| 精品女同一区二区三区在线播放| 一本色道久久88精品综合| 久久亚洲成人精品| 亚洲va久久久噜噜噜| 欧美成人免费全部观看天天性色| 国产美女直播视频一区| 久久人人看视频| 亚洲精品白浆高清久久久久久| 91精品国产九九九久久久亚洲| 一本久久综合亚洲鲁鲁| 国产91精品最新在线播放| 91九色国产社区在线观看| 国产z一区二区三区| 欧美高跟鞋交xxxxhd| 日韩欧美一区视频| 最近2019中文免费高清视频观看www99| 日韩欧美亚洲综合| 国产日韩欧美日韩| 91免费视频国产| 日本国产高清不卡| 欧美性xxxxx极品娇小| 亚洲国产精品资源| 性视频1819p久久| 欧美激情一区二区三级高清视频| 精品久久久久久久久久ntr影视| 黑人狂躁日本妞一区二区三区| 中文字幕av日韩| 国产精品欧美亚洲777777| 国产精品美乳在线观看| 中文字幕在线观看日韩| 日本道色综合久久影院| 亚洲一级片在线看| 都市激情亚洲色图| 亚洲精选一区二区| 色青青草原桃花久久综合| 欧美一区二区影院| 在线观看不卡av| 国产精品国产三级国产aⅴ9色| 欧美肥臀大乳一区二区免费视频| 日韩av免费看网站| 91夜夜揉人人捏人人添红杏| 伊人伊人伊人久久| 亚洲乱码av中文一区二区| 欧美性极品xxxx娇小| 亚洲精品成人久久久| 久久偷看各类女兵18女厕嘘嘘| 国产偷亚洲偷欧美偷精品| 国产精品影院在线观看| 麻豆一区二区在线观看| 国产精品xxx视频| 色爱av美腿丝袜综合粉嫩av| 国产乱肥老妇国产一区二| 精品国产鲁一鲁一区二区张丽| 一级做a爰片久久毛片美女图片| 亚洲精品久久久久久久久久久久久| 国产精品亚发布| 九九热这里只有在线精品视| 日韩欧美主播在线| 久久久电影免费观看完整版| 欧美黑人性猛交| 日本人成精品视频在线| 国内精品模特av私拍在线观看| 91福利视频网| 欧美精品日韩www.p站| 亚洲美女动态图120秒| 欧美成人免费在线视频| 久久久久久尹人网香蕉| 精品视频在线播放| 精品国产乱码久久久久久婷婷| 亚洲一区二区三区sesese| 精品成人av一区| 97在线看免费观看视频在线观看| 久久久久久久久久久久久久久久久久av| 亚洲天堂av在线播放| yw.139尤物在线精品视频| 亚洲tv在线观看| 精品少妇一区二区30p| 欧美专区中文字幕| 亚洲午夜未满十八勿入免费观看全集| 成人av资源在线播放| 国产精品久久久久久久av电影| 国产成人一区二区| 国产精品视频地址| 日日骚久久av| 欧美国产日本高清在线| 亚洲国产精品资源| 在线激情影院一区| 最近2019中文字幕第三页视频| 欧美激情啊啊啊| 国产精品1234| 亚洲一区制服诱惑| 国产欧美韩国高清| 久久伊人免费视频| 性色av一区二区三区| 国产精品入口尤物| 少妇高潮久久久久久潘金莲| 中文字幕一区二区三区电影| 日韩av电影在线免费播放| 欧美激情高清视频| 视频一区视频二区国产精品| 国产精品视频色| 国产精品亚洲欧美导航| 欧美大片网站在线观看| www.亚洲成人| 日韩国产在线看| 欧美日韩国产成人高清视频| 国产亚洲精品久久久久久| xx视频.9999.com| 国产日韩在线观看av| 亚洲欧洲国产一区| 亚洲va电影大全| 久久精品亚洲94久久精品| 孩xxxx性bbbb欧美| 最新国产成人av网站网址麻豆| 精品国产乱码久久久久久婷婷| 国产日韩欧美影视| 18久久久久久| 91精品在线看| 91精品视频一区| 国产91露脸中文字幕在线| 国产精品直播网红| 麻豆国产精品va在线观看不卡| 97视频免费观看| 亚洲福利视频专区| 久久久久日韩精品久久久男男| 在线看日韩欧美| 欧美另类69精品久久久久9999| 91网站在线看| 91豆花精品一区| 日韩视频―中文字幕| 7777精品久久久久久| 亚洲欧美在线第一页| 91精品国产91久久久久久不卡| 亚洲天堂网在线观看| 亚洲精品久久久久久久久久久久| 久久久最新网址| 成人黄色免费在线观看| 国产精品激情av电影在线观看| 成人网页在线免费观看| 亚洲色图18p| 欧洲亚洲在线视频| 久久久免费观看视频| 亚洲天堂免费在线| 国产精品ⅴa在线观看h| 日韩电影中文字幕在线观看| 日韩久久免费视频| 黑人巨大精品欧美一区免费视频| 亚洲欧美一区二区精品久久久| 欧美成在线视频| 久久精品国产精品亚洲| 国产成人免费av| 九九热在线精品视频| 精品国内亚洲在观看18黄| 九九精品在线播放| 久久中文字幕一区| 亚洲美女性生活视频| 亚洲精品一区中文字幕乱码| 在线精品国产成人综合| 国产精品日日做人人爱| 中文字幕亚洲情99在线| 神马久久桃色视频|