热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring源码之xml解析与BeanDefinition的封装obtainFreshBeanFactory()

spring容器加载核心方法refresh中obtainFreshBeanFactory()方法的解读上一篇文章我们初窥了spring容器加载的整体流程,现在我们来细品其中的obt

spring容器加载核心方法refresh中obtainFreshBeanFactory()方法的解读

上一篇文章我们初窥了spring容器加载的整体流程,现在我们来细品其中的obtainFreshBeanFactory()方法,你找了个女朋友,不能只沉浸其外表,我们还得去了解一下其内在不是,得试试水到底有多深。首先在这个放上该方法整体流程图,这个流程图可花了俺两三个小时呢,希望对你有研读spring源码有帮助,还有不要被这个流程图给吓到啦,看完我对代码的分析你就会发现原来不过如此。

技术分享图片


1.进入AbstractApplicationContext类的obtainFreshBeanFactory()方法

技术分享图片

这里是一个典型模板方法设计模式,refershBeanFactory是一个protected abstract修饰的方法,让子类去完成具体的实现,我们去看子类AbstractRefreshableApplicationContext的refreshBeanFactory()方法


2.进入AbstractRefreshableApplicationContext的refershBeanFactory()方法

技术分享图片


3.进入AbstractXmlApplicationContext的loadBeanDefinitions()方法

技术分享图片


技术分享图片


4.进入AbstractBeanDefinitionReader的loadBeanDefnitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片


5.进入XmlBeanDefinitionReader类的loadBeanDefinitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片


6.进入DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

这个方法中获取根节点的子节点,如果是默认标签就进入parseDefaultElement()方法  eg.。如果是自定义标签则进入delegate.parseCustomeElement()方法,eg.


7首先看默认标签解析方法


7.1进入parseDefaultElement()方法

方法重载

技术分享图片

方法重载
技术分享图片


7.2进入BeanDefinitionParserDelegate类的parseBeanDefinitionElement()方法

技术分享图片

方法重载
技术分享图片

方法重载,创建GenericBeanDefinition,然后完成各种子标签属性的解析,然后返回BeanDefiniton,spring实例化话只认识BeanDefinition

技术分享图片

 


8.自定义标签解析


8.1进入BeanDefinitionParserDelegate类的parseCustomElement()方法

技术分享图片

方法重载,下面这个方法是完成自定义标签解析的关键

技术分享图片


8.1.1首先获取namespaceuri

以扫描器为例

技术分享图片


8.1.2 resolve方法,进入DefaultNameSpaceHandlerResolver类的resolve()方法

技术分享图片


1.加载所有jar包META-INF/spring.handlers文件建立映射关系

技术分享图片


2.根据namespaceuri从映射关系找到NameSpaceHandler处理类

如果context标签就会找到ContextNameSpaceHandler.java


3.实例化

4.如context标签为例,调用ContextNameSpaceHandler的类init初始化方法,完成具体标签解析类的注册

技术分享图片


8.1.3调用parse方法完成解析,进入NameSpaceHandlerSupport类的parse方法

自定义标签处理类都继承自 NameSpaceHandlerSupport

技术分享图片

进入具体标签的处理类完成解析

技术分享图片

好啦,spring容器加载核心方法refresh中obtainFreshFactory方法暂告一段落,看到这里,想必对spring的xml解析及BeanDefinition的生成有了一定的了解,多少知道了点spring的深浅,而不是只趋于表面,关于注解扫描处理类ComponetScanBeanDefinitionParser具体的解析我们下篇文章再揭晓,如果你看得还比较舒服的话,那么请不要吝啬你的双手点个关注吧。

 


推荐阅读
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
justmoon999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有