我们了解spring源码在平时的开发中能够更快速的去定位问题,并且能够去学习这些框架中的设计模式
环境搭建
1.在idea中创建一个maven工程
相信大家都很熟悉,所以本文中略过。
2.创建一个java类

3.创建SpringBean配置文件

4.pom文件

说明:项目目录如下:其中MyApp类是和App类类似可以不用管。

进入spring源码--debug调试
首先我们要从main入口开始,进入ClassPathXmlApplicationContext类,如图:

然后进入到如下如代码部分:

调用自己的构造函数,传入configLocation配置文件信息,此处configLocation=SpringBean.xml,一个refresh参数为true,还一个空的上下文对象,然后进入:

这是refresh参数用到了,进入if逻辑,调用一个refresh方法,在此之前setConfigLocations主要是加载Spring配置文件的位置。下面是refresh方法代码如下:

其中,核心方法this.obtainFreshBeanFactory(),进入到这个方法代码如下:

主要有两个方法this.refreshBeanFactory()和this.getBeanFactory(),其中refreshBeanFactory()代码如下:

总的来说ClassPathXmlApplicationContext 这种形式的Spring配置文件的加载主要是下面的过程:
A:加载配置文件名到系统配置
B:销毁已有的Beans和BeanFactory
C:创建新的BeanFactory
D:加载Beans,分析Bean中的节点,然后加载到BeanFactory,BeanFactory生效。
网友评论