Spring源码(二)-Context的创建核心逻辑(上)

我们前一章介绍了spring的整体架构以及模块划分,也已经将代码导入ide中,那么接下来就要开始让人心动的Spring源码之旅了。

1、默认的Spring启动器

Spring源码(二)-Context的创建核心逻辑(上)

该方法是Springboot的启动类

2、进入SpringApplication.java

Spring源码(二)-Context的创建核心逻辑(上)

这里创建了一个SpringApplication方法,执行run方法,返回一个ConfigurableApplicationContext,这只是一个接口而已,根据名称来看,这是一个可配置的应用程序上下文。

3、进入RUN方法

SpringApplication(sources)这个类的初始化就先不看,这里面调用了initialize()方法,主要完成了当前的运行环境,以及设置了ApplicationListener相关的东西,这里我们先不做分析,直接进入run方法。

Spring源码(二)-Context的创建核心逻辑(上)

Spring源码(二)-Context的创建核心逻辑(上)

try代码块中是我们最核心的功能,代码中也添加了一部分的注释。我们先看context的创建过程即进入到createApplicationContext()方法。

Spring源码(二)-Context的创建核心逻辑(上)

DEFAULT_WEB_CONTEXT_CLASS —>AnnotationConfigEmbeddedWebApplicationContext

接下来执行AnnotationConfigEmbeddedWebApplicationContext的构造方法

Spring源码(二)-Context的创建核心逻辑(上)

上面实例化了AnnotatedBeanDefinitionReader以及ClassPathBeanDefinitionScanner

实例化AnnotatedBeanDefinitionReader

Spring源码(二)-Context的创建核心逻辑(上)

接下来是调用

Spring源码(二)-Context的创建核心逻辑(上)

实例化 ConditionEvaluator,将其属性ConditionContextImpl赋值

Spring源码(二)-Context的创建核心逻辑(上)

具体实现如下:

Spring源码(二)-Context的创建核心逻辑(上)

Spring源码(二)-Context的创建核心逻辑(上)

上面代码比较长,我们来分开解析

1、DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);

由wrap就可以看出此处使用的是装饰器模式,registry包裹成一个指定的beanFactory

Spring源码(二)-Context的创建核心逻辑(上)

代码执行到registry instanceof GenericApplicationContext(通过类继承结构可得到),随后调用GenericApplicationContext#getDefaultListableBeanFactory()方法,GenericApplicationContext在构造方法中实例化了属性beanFactory的值为DefaultListableBeanFactory:

Spring源码(二)-Context的创建核心逻辑(上)

其构造优先于AnnotationConfigEmbeddedWebApplicationContext构造方法执行。

以上获得了BeanFactory信息

头条的代码块不能高亮,所以截图,难免会有长代码不完整的地方,各位看官姥爷见谅,详情请查看原文,

链接: http://www.spring4all.com/article/15046

喜欢就给我来一波三连吧!

相关推荐