Spring中Xml屬性配置的解析全過程記錄

1 工程概述

1.1 pom文件

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <maven.compiler.source>1.8</maven.compiler.source>
 <maven.compiler.target>1.8</maven.compiler.target>
 <spring.version>5.2.8.RELEASE</spring.version>
 </properties>

 <dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.20</version>
 </dependency>
 <!-- 日志相關依賴 -->
 <dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.10</version>
 </dependency>
 <dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.1.2</version>
 </dependency>
 <dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>1.1.2</version>
 </dependency>
 </dependencies>

1.2 applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd"
 default-lazy-init="false">


 <bean id="student" class="com.rosh.bean.StudentBean"/>

 <context:component-scan base-package="com.rosh.service"/>

</beans>

1.3 StudentBean

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class StudentBean {


 private String name = "rosh";

 private String school = "杜橋中學";

 private String hobby = "籃球";

}

1.4 RoshTest

public class RoshTest {

 @Test
 public void mainTest(){
 ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
 StudentBean student = applicationContext.getBean(StudentBean.class);
 System.out.println(student.toString());

 }
}

1.5 運行結果

2 流程解析

2.1 源碼Debug

描述:調用構造方法中的refresh方法

描述:調用AbstractApplicationContext refresh()方法進行xml解析



重點: 創建XML對象的解析器



重點: 用xml文件解析器把xml文件轉換成Reource對象


重點: Resource對象轉Document對象

**重點:**創建Document解析器

總結: DefaultBeanDefinitionDocumentReader(Document解析器)解析xml文件

2.2 總結流程

大概步驟:

(1) 構造。

(2) 刷新工廠。

(3) 創建xml對象解析器。

(4) 將xml解析成Resource對象。

(5) Resource轉Document。

(6) 創建Document對象解析器。

(7) 解析Document對象。

詳細步驟:

1 ClassPathXmlApplicationContext調用構造方法。
2 AbstractApplicationContext:
 (1) 調用refresh()方法。
 (2) 調用obtainFreshBeanFactory()方法。
3 AbstractRefreshableApplicationContext調用refreshBeanFactory() 方法。
4 AbstractXmlApplicationContext:
	(1) loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法。創建XML解析器。
 (2) 調用loadBeanDefinitions(XmlBeanDefinitionReader reader)方法。
5 AbstractBeanDefinitionReader:
	(1) loadBeanDefinitions(String... locations)方法。  
	(2) loadBeanDefinitions(String location)方法。
	(3) loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources)方法,將XML解析成Resource對象。	
	(4) loadBeanDefinitions(Resource... resources)方法。
6 XmlBeanDefinitionReader:
	(1) loadBeanDefinitions(Resource resource) 方法。
	(2) loadBeanDefinitions(EncodedResource encodedResource) 方法。
	(3) doLoadBeanDefinitions(InputSource inputSource, Resource resource)方法。
	(4)	registerBeanDefinitions(Document doc, Resource resource)方法。創建Document解析器。
7 DefaultBeanDefinitionDocumentReader:
 (1) registerBeanDefinitions(Document doc, XmlReaderContext readerContext)方法。
 (2) doRegisterBeanDefinitions(Element root)方法。
 (3) parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 方法解析默認標簽、自定義標簽。

3 解析Bean標簽





4 自定義標簽解析

 4.1 步驟

1. 獲取自定義標簽的 namespace 命令空間,例如:http://www.springframework.org/schema/context
2. 根據命令空間獲取 NamespaceHandler 對象通過 SPI 機制獲取 spring 中所有 jar 包裡面的 “META-INF/spring.handlers”
文件,並且建立映射關系
3. 反射獲取 NamespaceHandler 實例
4. 調用對應標簽如 ContextNameHandler 標簽的 init()方法
5. 調用 handler.parse()方法完成解析

4.2 流程解析

1 根據自定義標簽尋找相應的uri

2 加載spring中全部MET-INF/spring.handlers


3 根據applicationContext.xml 找對應的Hadnler

4.3 Debug







總結

到此這篇關於Spring中Xml屬性配置解析的文章就介紹到這瞭,更多相關Spring Xml屬性配置解析內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: