spring 原始碼解讀與設計詳解:6 BeanDefinitionParserDelegate與資源解析
上篇文章中提到了spring資源載入的核心程式碼為;
DefaultBeanDefinitionDocumentReader類中的void registerBeanDefinitions(Document doc, XmlReaderContext readerContext)方法。
實質上XML檔案的解析是由XMLBeanDefinitionReader物件交由BeanDefinitionParserDelegate委託來完成的,實質上這裡面使用到了委託模式。
下面繼續講解registerBeanDefinitions方法,首先看程式碼:
解析過程為doRegisterBeanDefinitions(root)/** * This implementation parses bean definitions according to the "spring-beans" XSD * (or DTD, historically). * <p>Opens a DOM Document; then initializes the default settings * specified at the {@code <beans/>} level; then parses the contained bean definitions. */ @Override public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) { this.readerContext = readerContext; logger.debug("Loading bean definitions"); Element root = doc.getDocumentElement(); doRegisterBeanDefinitions(root); }
看最後幾行程式碼:/** * Register each bean definition within the given root {@code <beans/>} element. */ protected void doRegisterBeanDefinitions(Element root) { // Any nested <beans> elements will cause recursion in this method. In // order to propagate and preserve <beans> default-* attributes correctly, // keep track of the current (parent) delegate, which may be null. Create // the new (child) delegate with a reference to the parent for fallback purposes, // then ultimately reset this.delegate back to its original (parent) reference. // this behavior emulates a stack of delegates without actually necessitating one. BeanDefinitionParserDelegate parent = this.delegate; this.delegate = createDelegate(getReaderContext(), root, parent); if (this.delegate.isDefaultNamespace(root)) { String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE); if (StringUtils.hasText(profileSpec)) { String[] specifiedProfiles = StringUtils.tokenizeToStringArray( profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS); if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) { return; } } } preProcessXml(root); parseBeanDefinitions(root, this.delegate); postProcessXml(root); this.delegate = parent; }
preProcessXml(root);
parseBeanDefinitions(root, this.delegate);
postProcessXml(root);
this.delegate = parent;
這裡的preProcessXml和postProcessXml都是空實現,這個doRegisterBeanDefinitions方法使用了經典的模板方法設計模式,子類可以重寫preProcessXml和postProcessXml,實現對XML配置檔案的自定義擴充套件。類似於Junit的setUp、testXXX、tearDown方法
而Parent這裡,則是實現了beans的巢狀。
相關推薦
spring 原始碼解讀與設計詳解:6 BeanDefinitionParserDelegate與資源解析
上篇文章中提到了spring資源載入的核心程式碼為; DefaultBeanDefinitionDocumentReader類中的void registerBeanDefinitions(Document doc, XmlReaderContext readerContex
spring 原始碼解讀與設計詳解:5 XmlBeanDefinitionReader與Resource
spring資源載入過程簡單說分三步: 1、定位資源,也就是找到配置檔案 2、載入檔案,將檔案解析為一個個元素和屬性 3、將bean物件註冊到ioc容器中,如果存在依賴注入,則根據配置檔案選擇是否在載入容器的時候將依賴注入載入,預設是true。 下面我們一步一步分析De
Spring IOC原理原始碼解析(@Autowired原理詳解 :標識屬性與方法)(二 )
原始碼推薦看這篇部落格的時候開啟Spring原始碼,一邊看原始碼,一邊看部落格上程式碼的關鍵處的註釋,這樣能更好的理解Spring IOC的流程及內部實現和使用方法。如果你對IOC的原理有些瞭解,則這些註釋能幫你更深入的理解其實現方式。 Spring容器在每個
Spring Boot 配置文件詳解:Properties和YAML
列表 config 其他 操作系統 des num mat 變量 onf 一.配置文件的生效順序,會對值進行覆蓋: 1. @TestPropertySource 註解 2. 命令行參數 3. Java系統屬性(System.getProperties
Java開源生鮮電商平臺-Java後端生成Token架構與設計詳解(源碼可下載)
red 基於 一次 frame service state dha 概述 class Java開源生鮮電商平臺-Java後端生成Token架構與設計詳解(源碼可下載) 目的:Java開源生鮮電商平臺-Java後端生成Token目的是為了用於校驗客戶端,防止重復提交. 技
電商平臺-Java後端生成Token架構與設計詳解
目的:Java開源生鮮電商平臺-Java後端生成Token目的是為了用於校驗客戶端,防止重複提交. 技術選型:用開源的JWT架構。 1.概述:在web專案中,服務端和前端經常需要互動資料,有的時候由於網路相應慢,客戶端在提交某些敏感資料(比如按照正常的業務邏輯,此份資料只能儲存一
Linux中Nginx安裝與配置詳解(CentOS-6.5:nginx-1.5.0)
1 Nginx簡介Nginx ("engine x") 是一個高效能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0
Spring mvc請求處理流程詳解(一)之檢視解析
前言 Spring mvc框架相信很多人都很熟悉了,關於這方面的資料也是一搜一大把。但是感覺講的都不是很細緻,讓很多初學者都雲裡霧裡的。本人也是這樣,之前研究過,但是後面一段時間不用發現又忘記了。所以決定寫下來,以備後用。 本系列文基於spring-
Spring原始碼解讀與設計詳析 2018 (最全)
預設情況: 通常情況下子級div在浮動的情況下,會對父級的div後面的元素佈局產生影響,因為div在浮動的情況下,會脫離正常的文件流導致父級的盒子不能被撐起。這樣父級的高度就可能是0,會影響整個佈局。程式碼和效果如下: 程式碼: <style>
Java 高併發程式設計詳解:多執行緒與架構設計
內容簡介 本書主要包含四個部分: 部分主要闡述 Thread 的基礎知識,詳細介紹執行緒的 API 使用、執行緒安全、執行緒間資料通訊,以及如何保護共享資源等內容,它是深入學習多執行緒內容的基礎。 第二部分引入了 ClassLoader,這是因為 ClassLoader 與執行緒不無關係
分散式訊息系列:詳解RocketMQ的簡介與演進、架構設計、關鍵特性與應用場景
終身學習是程式設計師的必備能力,一群人在一起走得更遠,一起學習,共抗惰性。今天,我們來重點了解RocketMQ的簡介與演進、架構設計、關鍵特性及應用場景等內容。 本文內容大綱: RocketMQ的簡介與演進 RocketMQ的架構設計 RocketMQ的關鍵特性 RocketMQ的應用場景 01
Spring IOC原理原始碼解析(@Autowired原理詳解 :標識建構函式)(一 )
IOC,inversion of control 控制反轉,有時候也叫DI,dependency injection 依賴注入,是一種程式碼解耦的方式。 在一個類中定義一個屬性,正常情況下需要在此類中有對此屬性賦值的程式碼,如setter方法,或者在建構函式中
PHP面向對象詳解:繼承、封裝與多態
gets key copy nes col 成員變量 ret 封裝 文字 首先,在解釋面向對象之前先解釋下什麽是面向對象? [面向對象]1、什麽是類? 具有相同屬性(特征)和方法(行為)的一系列個體的集合,類是一個抽象的概念2、什麽是對象?從類中拿到的具有具體屬性值得個體,
轉:HttpModule與HttpHandler詳解
兩個 pro 密碼 work ring eve directory 配置信息 讓其 ASP.NET對請求處理的過程:當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的後綴(aspx)之後,將這個請求轉交給 ASPNET_ISAPI.
js內存空間 執行上下文 變量對象詳解 作用域鏈與閉包 全方位解讀this
變量 詳解 tail bsp pin 上下 AR detail net 內存空間:https://blog.csdn.net/pingfan592/article/details/55189622 執行上下文:https://blog.csdn.net/pingfan592
hive:textfile,sequencefile和rcfile的使用與區別詳解
hive在建立表時預設儲存格式是textfile,或者顯示自定義的stored as textfile.很多人知道hive常用的儲存格式有三種,textfile,sequencefile,rcfile.但是卻說不清楚這三種格式的幹什麼用的,本質有有什麼區別?適合什麼時候用?
一看就懂!【英雄聯盟銳雯】與 Python 詳解設計模式之門面模式
【網路配圖】 設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。使用設計模式的目的:為了程式碼可重用性、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣
Spring Boot 配置檔案詳解:自定義屬性、隨機數、多環境配置等
相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring應用時繁多的XML配置內容,替代它的是在pom.xml中引入模組化的Starter POMs,其中各個模組都有自己的預
高速電路設計實踐PDF,高速數字設計PDF-霍華德-約翰遜,高速電路設計與模擬分析Cadence例項設計詳解
今天給大家推薦三本關於高速電路設計的書籍,《高速電路設計實踐》《高速數字設計》《高速電路設計與模擬分析Cadence例項設計詳解》,第一本出自國內作者的一本好書,書中很多技術點都講的非常細緻,同時例舉了例項; 第二本為國外作者霍華德-約翰遜,深入淺出的講解了高速電路設計中應該注意的各種