Spring IOC 之解析Bean:解析 import 標籤

  • 若是根節點或者子節點採用默認命名空間的話,則調用 parseDefaultElement() 進行默認標籤解析
  • 不然調用 delegate.parseCustomElement() 方法進行自定義解析

默認標籤解析過程,源碼以下:java

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
	   // 對 import 標籤的解析
		if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
			importBeanDefinitionResource(ele);
		}
		// 對 alias 標籤的解析
		else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
			processAliasRegistration(ele);
		}
		// 對 bean 標籤的解析
		else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
			processBeanDefinition(ele, delegate);
		}
		// 對 beans 標籤的解析
		else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
			// recurse
			doRegisterBeanDefinitions(ele);
		}
	}
  • 分別是對四種不一樣的標籤進行解析,分別是 import、alias、bean、beans

import 標籤的處理

  •  Spring 提供了一個分模塊的思路,利用 import 標籤,例如咱們能夠構造一個這樣的 spring.xml

  • Spring 利用 importBeanDefinitionResource() 方法完成對 import 標籤的解析

解析 import 過程較爲清晰,整個過程以下:node

  1. 獲取 source 屬性的值,該值表示資源的路徑
  2. 解析路徑中的系統屬性,如"${user.dir}"
  3. 判斷資源路徑 location 是絕對路徑仍是相對路徑
  4. 若是是絕對路徑,則調遞歸調用 Bean 的解析過程,進行另外一次的解析
  5. 若是是相對路徑,則先計算出絕對路徑獲得 Resource,而後進行解析
  6. 通知監聽器,完成解析

判斷絕對路徑的規則以下:spring

  • 以 classpath*: 或者 classpath: 開頭爲絕對路徑
  • 可以經過該 location 構建出 java.net.URL爲絕對路徑
  • 根據 location 構造 java.net.URI 判斷調用 isAbsolute() 判斷是否爲絕對路徑

若是 location 爲絕對路徑則調用 loadBeanDefinitions(),該方法在 AbstractBeanDefinitionReader 中定義spa

若是是相對路徑則會根據相應的 Resource 計算出相應的絕對路徑,.net

  • 而後根據該路徑構造一個 Resource
  • 若該 Resource 存在,則調用 XmlBeanDefinitionReader.loadBeanDefinitions() 進行 BeanDefinition 加載
  • 不然構造一個絕對 location ,調用 AbstractBeanDefinitionReader.loadBeanDefinitions() 方法,與絕對路徑過程同樣

整個過程比較清晰明瞭:code

  • 獲取 source 屬性值,獲得正確的資源路徑,而後調用 loadBeanDefinitions()方法進行遞歸的 BeanDefinition 加載
相關文章
相關標籤/搜索