信息发布→ 登录 注册 退出

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

发布时间:2026-01-11

点击量:
目录
  • 1 工程概述
    • 1.1 pom文件
    • 1.2 applicationContext.xml
    • 1.3 StudentBean
    • 1.4 RoshTest
    • 1.5 运行结果
  • 2 流程解析
    • 2.1 源码Debug
    • 2.2 总结流程
  • 3 解析Bean标签
    • 4 自定义标签解析
      •  4.1 步骤
      • 4.2 流程解析
      • 4.3 Debug
    • 总结

      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







      总结

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!