SpringIOC源码解析(7)—— xml配置的资源定位、加载、解析、注册全链路分析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 调用过程复现:在DefaultListableBeanFactory的registerBeanDefinition里打上断点,运行Entrance,观察调用栈:

文章目录


调用过程复现:

在DefaultListableBeanFactory的registerBeanDefinition里打上断点,运行Entrance,观察调用栈:


9.png


Entrance源码:阅读Spring源码第一步:源码编译与创建调试入口

注册是从主函数开始的:


10.png


之后进入到FileSystemXmlApplicationContext的构造函数:

public FileSystemXmlApplicationContext(String configLocation) throws BeansException {
   this(new String[] {configLocation}, true, null);
}

又调用了另外一个构造函数:


public FileSystemXmlApplicationContext(
      String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
      throws BeansException {
   super(parent);
   setConfigLocations(configLocations);
   if (refresh) {
      refresh();
   }
}


对应变量的值:


11.png


其中configLocations是个数组,所以猜测最后调用了加载多个资源的方法。

又调用refresh()方法进行容器的初始化,此时又来到AbstractApplicationContext的refresh方法里:

12.png


又调用了obtainFreshBeanFactory方法,跳进去会发现它是调用了子类的refreshBeanFactory方法,以刷新子类的容器

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
   refreshBeanFactory();
   return getBeanFactory();
}

再往前进会发现实现refreshBeanFactory方法的是AbstractRefreshableApplicationContext类:


13.png


先创建了容器实例,再将实例传入到loadBeanDefinitions里

进入到loadBeanDefinitions,该方法是由AbstractXmlApplicationContext实现的:


protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
   // Create a new XmlBeanDefinitionReader for the given BeanFactory.
   // 为给定的BeanFactory创建一个新的XmlBeanDefinitionReader
   XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
   // Configure the bean definition reader with this context's
   // resource loading environment.
   beanDefinitionReader.setEnvironment(this.getEnvironment());
   // 将容器本身"献祭"
   beanDefinitionReader.setResourceLoader(this);
   beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
   // Allow a subclass to provide custom initialization of the reader,
   // then proceed with actually loading the bean definitions.
   initBeanDefinitionReader(beanDefinitionReader);
   loadBeanDefinitions(beanDefinitionReader);
}


14.png


先是定义了XmlBeanDefinitionReader的实例变量beanDefinitionReader,变量的构造函数便是传入的DefaultListableBeanFactory实例;


此外beanDefinitionReader还给自己的ResourceLoader设置上FileSystemXmlApplicationContext;


因此FileSystemXmlApplicationContext实例和DefaultListableBeanFactory实例便是通过beanDefinitionReader对象串联到了一起,这也就表明了打通了资源加载和BeanDefinition之间的通路。


再前进一步就是加载资源的配置流程了(AbstractXmlApplicationContext.java):


protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
   Resource[] configResources = getConfigResources();
   if (configResources != null) {
      reader.loadBeanDefinitions(configResources);
   }
   String[] configLocations = getConfigLocations();   // 从这里继续进
   if (configLocations != null) {
      reader.loadBeanDefinitions(configLocations);
   }
}


进入到getConfigLocations方法里:


@Override
public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
   Assert.notNull(locations, "Location array must not be null");
   int count = 0;
   for (String location : locations) {
      count += loadBeanDefinitions(location);
   }
   return count;
}

这里就是根据location来逐个调用loadBeanDefinitions去加载。

继续进到loadBeanDefinitions方法里:


15.png


可以看到确实是使用了ResourcePatternResolver来进行加载的,和上面的推断一样是用可以同时加载多个资源的。

再进入两层到loadBeanDefinitions方法里:


16.png


发现到了对resource包裹上EncodedResource这一步

再进入一层,此时就是对资源进行编码处理了:


17.png


进入到实际干活的doLoadBeanDefinitions中:

18.png


这里面主要就是将xml解析成document对象了,解析完成之后就进入到注册阶段

注册阶段:


18.png


先是将Document对象解析成一个个的BeanDifinitions

19.png


继续进入到doRegisterBeanDefinitions里:


20.png


就会发现这里开始解析BeanDefinition了,并且此处的delegate对象是BeanDefinitionParserDelegate对象

之后就会进入解析逻辑里面进行BeanDefinition的解析了:


21.png


因为我们遵循的是xml定义的规范,所以会执行parseDefaultElement方法,方法之前已经分析过了,这一步会递归执行多次。


再往深一点就会看到调用了delegate的parseBeanDefinitionElement方法区解析出包含了BeanDefinition实例的BeanDefinitionHolder包装实例


22.png

之后就来到了SpringIOC源码解析(5)—— BeanDefinition的注册中的BeanDefinition的注册环节了,最终将BeanDefinition实例注册到容器里,同时,如果BeanDefinition先前已经注册过了,就需要清空先前的注册信息,如果是单例,将先前已经创建出来的bean实例给清除掉,因为bean实例赖以生存的BeanDefinition已经改变了。


相关文章
|
4月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
176 7
使用Java和XPath在XML文档中精准定位数据
|
2天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
18 6
|
4天前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
4月前
|
JavaScript API 数据安全/隐私保护
【Azure Developer】Azure AD 注册应用的 OAuth 2.0 v2 终结点获取的 Token 解析出来依旧为v1, 这是什么情况!
【Azure Developer】Azure AD 注册应用的 OAuth 2.0 v2 终结点获取的 Token 解析出来依旧为v1, 这是什么情况!
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
248 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
2月前
|
域名解析 网络协议
非阿里云注册域名如何在云解析DNS设置解析?
非阿里云注册域名如何在云解析DNS设置解析?
|
3月前
|
XML Java 应用服务中间件
springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】
通过一个HelloWorld实例,介绍了SpringMVC的基本概念、执行流程,并详细讲解了如何创建和配置第一个SpringMVC项目(基于XML)。
springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】
|
2月前
|
XML 分布式计算 资源调度
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
182 5
|
2月前
|
XML 资源调度 网络协议
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
145 4
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
88 4

推荐镜像

更多
下一篇
DataWorks