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

news/2024/7/7 19:13:52

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/4556660.html

相关文章

我不太清楚 请高手指导一下 是先学c语言再学c++好还是先学c++再学c语言好

||| C语言 ||| 我觉得还是学习完C言再学C好C言是编程的最基础啊 但是我个人不这样认为 所以建议先学c&#xff1b;但是也有人说学c最后不要学c 比较抽象 但是c是面向对象的 更接近一半人的思维模式 而且是面向过程的 先c后c&#xff1b;这是我的经验c比较基础 一面混淆

Spring Bean 的实例化过程源码解析

引言 概述&#xff1a; Spring Bean 创建源码分析系列 【1】Spring Bean 的实例化过程源码解析 【2】Spring 依赖注入(DI) 源码解析 【3】Spring 三级缓存解决循环依赖 1 工程概述 1.1 pom <properties><project.build.sourceEncoding>UTF-8</project.build…

爬虫--Scrapy框架课程介绍

Scrapy框架课程介绍&#xff1a; 框架的简介和基础使用持久化存储代理和cookie日志等级和请求传参CrawlSpider基于redis的分布式爬虫一scrapy框架的简介和基础使用 a) 概念&#xff1a;为了爬取网站数据而编写的一款应用框架&#xff0c;出名&#xff0c;强大。所谓的框…

关于c语言的一些问题

这样就有默认值了 只要最后包在“ ”中就行了 答案补充 加一个system("y");在原来的那个后面看看 ||| 赋值给变量 system("format d: /y")&#xff1b; ||| 语句应该有&#xff1b;结尾system("format d:")&#xff1b;要设置参数的话直接和dos命…

Spring 依赖注入(DI) 源码解析

引言 概述&#xff1a; Spring Bean 创建源码分析系列 【1】Spring Bean 的实例化过程源码解析 【2】Spring 依赖注入(DI) 源码解析 【3】Spring 三级缓存解决循环依赖 1 工程 1.1 StudentController Controller public class StudentController {Autowiredprivate Student…

c语言的 a++ 和 ++a有什么区别

||| 如果要打印的值是a如printf("%d" 然后等结束本句的时候加一&#xff08;先使用后加一&#xff09;而a值等于a1 再打印出来.具体差别你可以自己试着运行比较一下. a);那打印出来的只是A的值.但是第二次打印的A值就是后的值.就是先打印后;A就是先改变A的值 a是先把…

vim 安装molokai主题

在.vim文件夹下创建文件夹colors 进入 https://github.com/tomasr/molokai 下载molokai.vim 将其放入colors文件夹下 进入.vimrc中 添加 " 代码颜色主题 syntax on syntax enable set t_Co256 colorscheme molokai 重新打开vim&#xff0c;就会发现主题已经变了。 转载于:…

(C语言) 怎么用代码实现一个学生成绩管理系统

||| 用C语言的话界面应该不会很好看吧. ||| 需求分析清楚 595387031 ||| 大哥你为什么要用C语言实现 要的话我从QQ上发给你好了 程序发不上来 问问说我的回答重复的字数太多了 它用来操纵数据库可不是太理想哦 代码不过是积木