1. 程式人生 > >spring 原始碼解讀與設計詳解:6 BeanDefinitionParserDelegate與資源解析

spring 原始碼解讀與設計詳解:6 BeanDefinitionParserDelegate與資源解析

上篇文章中提到了spring資源載入的核心程式碼為;

DefaultBeanDefinitionDocumentReader類中的void registerBeanDefinitions(Document doc, XmlReaderContext readerContext)方法。

實質上XML檔案的解析是由XMLBeanDefinitionReader物件交由BeanDefinitionParserDelegate委託來完成的,實質上這裡面使用到了委託模式。

下面繼續講解registerBeanDefinitions方法,首先看程式碼:

/**
	 * 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);
	}
解析過程為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 XmlBeanDefinitionReaderResource

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.5nginx-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、什麽是對象?從類中拿到的具有具體屬性值得個體,

HttpModuleHttpHandler

兩個 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

hivetextfile,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例項設計詳解》,第一本出自國內作者的一本好書,書中很多技術點都講的非常細緻,同時例舉了例項; 第二本為國外作者霍華德-約翰遜,深入淺出的講解了高速電路設計中應該注意的各種