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方法没有过时。

浙公网安备 33010602011771号