Spring 源码深度解析(第 2 版)读书笔记(三)BeanDefinition在XML配置文件下的加载流程

1 public class MyApplicationContext {
2     public static void main(String[] args) {
3         ClassPathResource resource = new ClassPathResource("application.xml");
4         XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(resource);  断点打在了这里,这里是入口
5         example bean = xmlBeanFactory.getBean("example", example.class);
6     }
7 }

1 private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); reader就是之前说过的XmlBeanDefinitionReader,用来加载配置文件的

 

从代码中可以看出,这个是用来对XML文件进行编码解析的

进入loadBeanDefinition方法中,对resource做了转换,然后开始加载

 

在doLoadBeanDefinition方法中,两个重要方法

 

 

第一步:将xml转换成document对象

第二步:将document解析成beanDefinition

进入registerBeanDefinitions 方法中:

进入 doRegisterBeanDefinitions 方法中:

 

进入解析方法 parseBeanDefinitions 中:

 

里面有两种解析逻辑,自定义标签(就是那些tx,context啥的开头的标签)的解析暂时不看,看默认标签的:

 

import的解析其实就是对给的标签地址解析,然后读取文件,递归调用加载流程;主要看第三个方法,对bean标签的解析:

 

主要分成两步:解析、注册

开始第一步,对标签的解析:

方法跳转到工具人delegate 上

 

解析工作就像是剥洋葱一样,一层一层解析,接下来是进入下一层parseBeanDefinitionElement中:

 

然后是进入上面的第三层方法 parseBeanDefinitionAttributes :

第三层解析完成,方法返回,方法栈弹出,回到第二步,将解析之后的beanDefinition注册:

 

进入方法 registry 的 registerBeanDefinition 方法中:

 

 

到此,注册工作也完成了,方法返回,方法栈不断弹出,回到了最开始的那段代码中:

 

public class MyApplicationContext {
     public static void main(String[] args) {
         ClassPathResource resource = new ClassPathResource("application.xml");
         XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(resource);  方法回到这里,也就是说IOC已经完成创建,最关键的beanDefinition也已经加载完成,IOC已经具备管理bean的能力,但是bean还没有开始创建,这一步仅仅是完成配置文件的加载
       example bean = xmlBeanFactory.getBean("example", example.class);  当我们开始调用方法,获取bean,那么bean 的加载就开始了
     }
 }

 

以上的beanDefinition的加载方法是XML配置文件,与注解方式和JavaConfig方法加载流程不完全一样,但也是解析、注册两步,其实是加载的来源不一样,而解析工作也变得更简单,注册步骤是一样的。

上面代码中的XmlBeanFactory,在5.2.X中是过时的,但是里面那个XmlBeanDefinitionReaderloadBeanDefinition方法没有过时。

 

posted @   huang1993  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示