BeanDefinition的Resource定位——3

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   使用   ar   

1.我們重點看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的實現,這個refreshBeanFactory被FileSystemXmlApplicationContext建構函式中的refresh調用。在這個方法中,通過createBeanFactory構建了一個IoC容器供ApplicationContext使用。這個IoC容器就是我們前面提到過的DefaultListableBeanFactory,同時,它啟動了loadBeanDefinitions來載入BeanDefinition,這個過程和前面以編程的方式來使用IoC容器(XmlBeanFacoty)的過程非常類似。

 1 protected final void refreshBeanFactory() throws BeansException { 2         // 這裡判斷,如果已經建立了BeanFactory,則銷毀並關閉該BeanFactory 3         if (hasBeanFactory()) { 4             destroyBeans(); 5             closeBeanFactory(); 6         } 7         // 這裡是建立並設定持有的DefaultListableBeanFactory的地方 8         // 同時調用loadBeanDefinitions載入BeanDefinition的資訊 9         try {10             DefaultListableBeanFactory beanFactory = createBeanFactory();11             beanFactory.setSerializationId(getId());12             customizeBeanFactory(beanFactory);13             loadBeanDefinitions(beanFactory);14             synchronized (this.beanFactoryMonitor) {15                 this.beanFactory = beanFactory;16             }17         }18         catch (IOException ex) {19             throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);20         }21     }
AbstractRefreshableApplicationContext對容器的初始化

 

1 // 這就是在上下文中建立DefaultListableBeanFactory的地方,而getInternalParentBeanFacoty()2     // 的具體實現可以3     // 查看AbstractApplicationContext中的實現,會根據容器已有的雙親IoC容器的資訊來產生4     // DefaultListableBeanFactory的雙親IoC容器5     protected DefaultListableBeanFactory createBeanFactory() {6         return new DefaultListableBeanFactory(getInternalParentBeanFactory());7     }
createBeanFactory

 

1 // 這裡是使用BeanDefinitionReader載入Bean定義的地方,因為允許有多種載入方式,雖然用得2     // 最多的事XML定義的形式,這裡通過一個抽象函數把具體的實現委託給子類來完成3     protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)4             throws BeansException, IOException;
loadBeanDefinitions
 1 // 對於取得Resource的具體過程,我們可以看看DefaultResourceLoader是怎樣完成的 2     public Resource getResource(String location) { 3         Assert.notNull(location, "Location must not be null"); 4         //  5         if (location.startsWith("/")) { 6             return getResourceByPath(location); 7         } 8         else if (location.startsWith(CLASSPATH_URL_PREFIX)) { 9             return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());10         }11         else {12             try {13                 // Try to parse the location as a URL...14                 URL url = new URL(location);15                 return new UrlResource(url);16             }17             catch (MalformedURLException ex) {18                 // No URL -> resolve as resource path.19                 return getResourceByPath(location);20             }21         }22     }
getResource

 

 2.前面我們看到的getResourceByPath會被子類FileSystemXmlApplicationContext實現,這個方法返回的是一個FileSystemResource對象,通過這個對象,Spring可以進行相關的I/O操作,完成BeanDefinition的定位。分析到這裡已經一目瞭然,它實現的就是對path進行解析,然後產生一個FileSystemResource對象並返回,代碼清單如下所示。

 

1 protected Resource getResourceByPath(String path) {2         if (path != null && path.startsWith("/")) {3             path = path.substring(1);4         }5         return new FileSystemResource(path);6     }
FileSystemXmlApplicationContext產生FileSystemResource對象

 

3.如果是其他的ApplicationContext,那麼會對應產生其他種類的Resource,比如ClassPathResource、ServletContextResource等。

4.關於Spring中Resource的種類,可以在圖1的Resource類的繼承關係中瞭解。作為介面Resource定義了許多與I/O相關的操作,這些操作也都可以從圖1種的Resource的介面定義中看到。這些介面對不同的Resource實現代表著不同的意義,是Resource的實現需要考慮的。Resource介面的實現在Spring中的設計1所示。

圖1 Resource的定義和繼承關係

5.從圖1中我們可以看到Resource的定位和它的繼承關係,通過對前面的實現原理的分析,我們以FileSystemXmlApplicationContext的實現為例子,瞭解Resource定位問題的解決方案,即以FileSystem方式存在的Resource的定位實現。

6.在BeanDefinition定位完成的基礎上,就可以通過返回的Resource對象來進行BeanDefinition的載入了。

7.在定位過程完成以後,為BeanDefinition的載入創造了I/O操作的條件,但是具體的資料還沒有開始讀入。這些資料的讀入將在下面的BeanDefinition的載入和解析中來完成。

8.任然以水桶為例子,這裡就像用水桶去打水,要先找到水源。這裡完成對Resource的定位,就類似於水源已經找到了,下面就是打水的過程了,類似於把找到的水裝到水桶裡的過程。找水不簡單,但是與打水相比,我們發現打水更需要技巧。

 

BeanDefinition的Resource定位——3

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.