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中是过时的,但是里面那个XmlBeanDefinitionReader 的 loadBeanDefinition方法没有过时。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?