Spring中Xml属性配置的解析全过程记录

时间:2022-09-22 21:49:11

1 工程概述

Spring中Xml属性配置的解析全过程记录

1.1 pom文件

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. <maven.compiler.target>1.8</maven.compiler.target>
  5. <spring.version>5.2.8.RELEASE</spring.version>
  6. </properties>
  7.  
  8. <dependencies>
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.13</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-context</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.projectlombok</groupId>
  21. <artifactId>lombok</artifactId>
  22. <version>1.16.20</version>
  23. </dependency>
  24. <!-- 日志相关依赖 -->
  25. <dependency>
  26. <groupId>org.slf4j</groupId>
  27. <artifactId>slf4j-api</artifactId>
  28. <version>1.7.10</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>ch.qos.logback</groupId>
  32. <artifactId>logback-classic</artifactId>
  33. <version>1.1.2</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>ch.qos.logback</groupId>
  37. <artifactId>logback-core</artifactId>
  38. <version>1.1.2</version>
  39. </dependency>
  40. </dependencies>

1.2 applicationContext.xml

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd"
  9. default-lazy-init="false">
  10.  
  11. <bean id="student" class="com.rosh.bean.StudentBean"/>
  12.  
  13. <context:component-scan base-package="com.rosh.service"/>
  14.  
  15. </beans>

1.3 StudentBean

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @ToString
  5. public class StudentBean {
  6.  
  7. private String name = "rosh";
  8.  
  9. private String school = "杜桥中学";
  10.  
  11. private String hobby = "篮球";
  12.  
  13. }

1.4 RoshTest

  1. public class RoshTest {
  2.  
  3. @Test
  4. public void mainTest(){
  5. ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
  6. StudentBean student = applicationContext.getBean(StudentBean.class);
  7. System.out.println(student.toString());
  8.  
  9. }
  10. }

1.5 运行结果

Spring中Xml属性配置的解析全过程记录

2 流程解析

2.1 源码Debug

描述:调用构造方法中的refresh方法

Spring中Xml属性配置的解析全过程记录

描述:调用AbstractApplicationContext refresh()方法进行xml解析

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

重点: 创建XML对象的解析器

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

重点: 用xml文件解析器把xml文件转换成Reource对象

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

重点: Resource对象转Document对象

Spring中Xml属性配置的解析全过程记录

**重点:**创建Document解析器

Spring中Xml属性配置的解析全过程记录

Spring中Xml属性配置的解析全过程记录

总结: DefaultBeanDefinitionDocumentReader(Document解析器)解析xml文件

Spring中Xml属性配置的解析全过程记录

2.2 总结流程

大概步骤:

(1) 构造。

(2) 刷新工厂。

(3) 创建xml对象解析器。

(4) 将xml解析成Resource对象。

(5) Resource转Document。

(6) 创建Document对象解析器。

(7) 解析Document对象。

详细步骤:

  1. 1 ClassPathXmlApplicationContext调用构造方法。
  2. 2 AbstractApplicationContext
  3. (1) 调用refresh()方法。
  4. (2) 调用obtainFreshBeanFactory()方法。
  5. 3 AbstractRefreshableApplicationContext调用refreshBeanFactory() 方法。
  6. 4 AbstractXmlApplicationContext
  7. (1) loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法。创建XML解析器。
  8. (2) 调用loadBeanDefinitions(XmlBeanDefinitionReader reader)方法。
  9. 5 AbstractBeanDefinitionReader
  10. (1) loadBeanDefinitions(String... locations)方法。
  11. (2) loadBeanDefinitions(String location)方法。
  12. (3) loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources)方法,将XML解析成Resource对象。
  13. (4) loadBeanDefinitions(Resource... resources)方法。
  14. 6 XmlBeanDefinitionReader:
  15. (1) loadBeanDefinitions(Resource resource) 方法。
  16. (2) loadBeanDefinitions(EncodedResource encodedResource) 方法。
  17. (3) doLoadBeanDefinitions(InputSource inputSource, Resource resource)方法。
  18. (4) registerBeanDefinitions(Document doc, Resource resource)方法。创建Document解析器。
  19. 7 DefaultBeanDefinitionDocumentReader
  20. (1) registerBeanDefinitions(Document doc, XmlReaderContext readerContext)方法。
  21. (2) doRegisterBeanDefinitions(Element root)方法。
  22. (3) parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 方法解析默认标签、自定义标签。

3 解析Bean标签

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

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

Spring中Xml属性配置的解析全过程记录

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

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

3 根据applicationContext.xml 找对应的Hadnler

Spring中Xml属性配置的解析全过程记录

4.3 Debug

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

Spring中Xml属性配置的解析全过程记录

Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录
Spring中Xml属性配置的解析全过程记录

总结

到此这篇关于Spring中Xml属性配置解析的文章就介绍到这了,更多相关Spring Xml属性配置解析内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34125999/article/details/114740545