浅谈Spring--程序入口

277 阅读3分钟

当你按下Run的时候,Spring需要读取配置文件、将配置文件信息保存、根据相关信息实例化出它管理的对象。Spring将这个复杂的初始化管理的井井有条,所以我们部署下来它的源码,看看它的“出生”到底经历了什么?

首先,需要创建一个相应的容器,我们以ClassPathXmlApplicationContext为例,进入构造方法之后向下调试:

可以看到它会携带者配置文件调用一个refresh(),这个方法是它的父类实现的。由此我们可以得到结论,refresh()是spring启动的核心方法,它里面就执行了我们上面所讨论的诸多步骤。那么我们直接看他的第二行代码:

返回了一个BeanFactory对象,所以我们猜想这里面就会有Bean工厂的创建,之后我们就能从工厂里拿到对象。

这就是为什么我们写代码的时候要注意命名规范,可以方便之后的人观看,在此处就得到了体现

点开这个方法,里面又是方法的调用。得不到想要的,我们继续跟进时却发现该方法是个抽象方法,所以看看它的子类有没有具体的实现:

到这里已经很明显了,是一个钩子方法.对模板方法模式不熟悉的同学可以参考我的设计模式篇.

进入子类的实现,可以看到这个createBeanFactory()创建出来了一个对象,但是其内部值为空(还未进行赋值)。

这个对象就是当前类所持有的一个对象:

继续向下看,又是一个钩子方法。我们点进去它的子类实现:

经历了漫长的跟进过后,我们找到了终点:

看到抽象方法,第一个念头就应该时钩子,回退一步看看有没有子类实现:

果然如此,在xml实现的子类中,我们终于看到了希望:

Spring将配置文件最终读入了InputSource,这是一个jdk自带的解析xml的类。对,这么久了,Spring终于决定要解析这个配置文件了。

至此,Spring已经将xml读入Document中,完成了第一步的装入内存。

随着箭头的方法继续跟进,我们也能猜到它的下一步:进一步解析Document对象,来将xml中的每个标签都得到,为实例化做准备。

可以看到Spring分成了两类来解析,默认标签和自定义标签。

由于篇幅有限,所以标签的具体解析过程会在下一篇分开写。

通过这篇文章也可以看出来,Spring本身封装较为严密,所以分析起来也会较为复杂,但这是每个程序员的必经之路,加油吧!