這篇文章主要講解了“Spring懶加載的單例Bean獲取過程是怎樣的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring懶加載的單例Bean獲取過程是怎樣的”吧!
xml的讀取應該是Spring的重要功能,因為Spring的大部分功能都是以配置做為切入點的。
我們在靜態代碼塊中讀取配置文件可以這樣做:
//這樣來加載配置文件 XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
(1)XmlBeanFactory 繼承 AbstractBeanDefinitionReader ,使用ResourceLoader 將資源文件路徑轉換為對應的Resource文件。 (2)通過DocumentLoader 對 Resource 文件進行轉換,將 Resource 文件轉換為 Document 文件。 (3)通過實現接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader 類對Document 進行解析,并且使用 BeanDefinitionParserDelegate對Element進行解析。
在平常開發中,我們也可以使用Resource 獲取 資源文件:
Resource resource = new ClassPathResource("application.xml"); InputStream in = resource.getInputStream();
在資源實現加載之前,調用了 super(parentBeanFactory) -- /**Ignore the given dependency interface for autowiring.(忽略接口的自動裝配功能)*/ 調用XmlBeanDefinitionReader 的 loadBeanDefinitions()方法進行加載資源: (1) 對Resource資源進行編碼 (2) 通過SAX讀取XML文件來創建InputSource對象 (3) 核心處理
可以很直觀的看出來是這個function是在解析xml文件從而獲得對應的Document對象。
在doLoadDocument方法里面還存一個方法getValidationModeForResource()用來讀取xml的驗證模式。(和我關心的沒什么關系,暫時不看了~) 轉換成document也是最常用的方法: 
/**Register the bean definitions contained in the given DOM document*/
參數doc是doLoadBeanDefinitions()方法傳進來的 loadDocument 加載過來的。這邊就很好的體現出了面向對象的單一全責原則,將邏輯處理委托給單一的類去處理。
在這邊單一邏輯處理類是: BeanDefinitionDocumentReader
核心方法: documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
開始解析:
在Spring的xml配置中有兩種方式來聲明bean:
一種是默認的: <bean id = " " class = " " /> 還有一種是自定義的: < tx : annotation-driven / >
通過xml配置文件的默認配置空間來判斷: http://www.springframework.org/schema/beans
對于默認標簽的解析:
對Bean 配置的解析:
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); 返回BeanDefinitionHolder
這邊代碼大致看下來:
提取元素中的id和name屬性
進一步解析將其他屬性封裝到 BeanDefinition 的實現類中
如果沒有指定beanName 變使用默認規則生成beanName
封裝類BeanDefinitionHolder
可以先了解一下 BeanDefinition 這個類的作用。
BeanDefinition是一個接口,對應著配置文件中<bean>里面的所有配置,在Spring中存在著三個實現類:
在配置文件中,可以定義父<bean>和子<bean>,父<bean>是用RootDefinition來表示,子<bean>是用ChildBeanDefinition來表示。 Spring 通過BeanDefiniton將配置文件中的<bean>配置信息轉換為容器內部表示,并且將這些BeanDefinition注冊到BeanDefinitonRegistry中。
Spring容器的BeanDefinitonRegistry就像是Spring配置信息的內存數據庫,主要是以map的形式保存的。
因此解析屬性首先要創建用于承載屬性的實例:
然后就是各種對屬性的解析的具體方法:
感謝各位的閱讀,以上就是“Spring懶加載的單例Bean獲取過程是怎樣的”的內容了,經過本文的學習后,相信大家對Spring懶加載的單例Bean獲取過程是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。