Spring容器要乾的活是解析Bean的配置文件和註解,然後實例化Bean。
要做解析的工作,就需要一個Reader;要做實例化的工作,就需要一個BeanFactory。
先講解析Bean的配置文件。配置文件可以是文件、URL資源、InputStream資源等,Spirng把這些配置文件封裝爲Resource,然後從這個Resource實例讀取輸入流,通過輸入流構建InputSource(注意InputSource這個類並不是來自Spring,它的的全名是org.xml.sax.InputSource,就是我們常用來解析xml文件的那個)。有了Resource實例和InputSource實例就可以調用doLoadBeanDefinitons(inputsource,resource)了,這個函數是解析的核心。那爲什麼有了InputSource實例,我們還要用Resource實例?後面馬上講到。
doLoadBeanDefinitons函數做了三件事:
(1).獲取對XML文件的驗證模式
(2).加載XML文件,得到對應的Document
(3).根據返回的Document註冊Bean信息
驗證XML文件是爲了保證它的正確性,驗證模式主要有DTD和XSD。怎麼判斷XML文件使用的是哪種驗證模式,這裏就回答了第一個問題,Spring通過resource.getInputStream(),然後new BufferReader(new InputStreamReader(inputStream)),通過這個BufferReader實例一行一行的讀原文件,如果當前行否包含了‘DOCTYPE’,那驗證模式就是DTD,否則就是XSD。
用sax獲得XML文件對應的Document實例,這裏和我們平時使用sax的方式一樣。
然後通過Document實例doc.getDocumentElement()獲得根root,調用函數doRegisterBeanDefinitons(root),函數doRegisterBeanDefinitons(root)再調用parseBeanDefinitions(root,this.delegate),這裏就出現了兩種情況:
(1).解析默認標籤
(2).解析自定義標籤
2017-07-26更新