Spring源码解析(二)
Spring源码(二)
分析spring源码,弄懂和掌握spring源码对我们日后的编程有着很大的帮助;话不多说,让我们一起开始学习吧~~
Spring早期XML解析
上节我们学习了Spring源码的入口方式,接下来开始深入的了解Spring源码啦~~
首先为了准确的查看类之间方法的调用,先分析三种方式下类的结构
有了上面的类结构,下面开始分析spring的核心方法refresh();
首先我们来看obtainFreshBeanFactory()方法
根据上面分析的类结构,主要是对ClassPathXmlApplicationContext类的实现方法(也就是xml解析),另外两个类仅仅只是为BeanFactory设置了id
开始XML解析
进入到AbstractRefreshableApplicationContext(XML继承的抽象类)
loadBeanDefinitions()方法是最重要的,进入到该方法中,一步步走下去
这里提醒一下:在看源码的过程中,我们不必每个方法每一步都点进去看,因为有些方法并不是很重要
最终来到parseBeanDefinitions()方法
这里就开始真正的解析xml配置标签,标签分为默认标签和自定义标签
首先我们来看默认标签
我们看到默认标签包括import、alias、bean以及beans标签
点到bean标签的解析
可以大概分成两步,一、创建一个beanDefinition 二、为bd设置属性(lookup、property…) 然后返回bd
其他几个默认标签可以自行去看下,平时用的也不多
接下来我们来看自定义标签
这两个方法是解析自定义标签的关键
先看第一个方法
从源码可以看出首先会生成一个mappings
注意第一个红框的代码如果你在debug的模式下面,IDEA会单独开启一个线程去执行toString()方法,这里就已经执行了一次
所以debug时,这里的mappings就已经有值了
第二个红框就是运用到所谓的SPI的思想,就加载jar底下的META-INF/spring.handlers文件(springboot/springcloud/dubbo也是运用到了SPI思想去加载配置文件)
然后调用每个handel的init()方法
最终放到
parses这个集合中,方便后面去执行parse方法,如图
我们以ComponentScanBeanDefinitionParser为例子
主要是看scanner.doScan方法,这里是扫描包底下有@component注解的类,然后创建一个bd
this.registerComponents()方法也就是之前在源码(一)的时候所提到的注册几个重要的PostProcessor
不管是默认标签还是自定义标签,当我们创建了一个bd后,最后都会注册bd,调用registerBeanDefinition()方法
存放在这三个集合当中,为后面bean的实例做铺垫
好了,Spring XML源码的解析就到这里了,后面我们接着继续~~