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

2025-05-29 0 49

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. <dependencies>
  8. <dependency>
  9. <groupId>junit</groupId>
  10. <artifactId>junit</artifactId>
  11. <version>4.13</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-context</artifactId>
  16. <version>${spring.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.projectlombok</groupId>
  20. <artifactId>lombok</artifactId>
  21. <version>1.16.20</version>
  22. </dependency>
  23. <!– 日志相关依赖 –>
  24. <dependency>
  25. <groupId>org.slf4j</groupId>
  26. <artifactId>slf4j-api</artifactId>
  27. <version>1.7.10</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>ch.qos.logback</groupId>
  31. <artifactId>logback-classic</artifactId>
  32. <version>1.1.2</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>ch.qos.logback</groupId>
  36. <artifactId>logback-core</artifactId>
  37. <version>1.1.2</version>
  38. </dependency>
  39. </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. <bean id="student" class="com.rosh.bean.StudentBean"/>
  11. <context:component-scan base-package="com.rosh.service"/>
  12. </beans>

1.3 StudentBean

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

1.4 RoshTest

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

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属性配置解析内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Spring中Xml属性配置的解析全过程记录 https://www.kuaiidc.com/108389.html

相关文章

发表评论
暂无评论