Spring源码 之 Bean生命周期——基础篇

前言:

IoC 全称为 Inversion of Control,翻译为 “控制反转”,从字面意思来说就是对象的创建及相互依赖关系交由容器进行管理。

SpringIOC作为控制反转思想的优秀实现,在容器启动时读取应用程序提供的Bean配置信息,然后实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

本文章从Spring Bean生命周期(并没有包含Bean循环依赖的过程)角度一探Spring Bean的create原理。

Bean生命周期:

这里我用的是AnnotationConfigApplicationContext作为Spring容器的启动入口,而非ClassPathXmlApplicationContext或FileSystemXmlApplicationContext,不过本质都是一样,核心方法都是refresh()作为入口

Spring源码 之 Bean生命周期——基础篇_第1张图片

进入到refresh方法里面,这里包含了容器启动的全部大致流程,下图这两个是准备BeanFactory和执BeanFactoryPostProcessor的后置处理器后置方法PostProcessorBeanFactory的调用,如果我们自定义了一个BeanFactoryPostProcessor的实现类,那个执行顺序是先执行BeanFactoryPostProcessor实现类的构造器,然后执行BeanFactoryPostProcessor实现类的后置方法PostProcessorBeanFactory,并且这个后置处理器的执行时机是在最前面的,优于InstatiationAwarePostProcessor、BeanPostProcessor、InitializationBean、@PostConstruc等。

我们自定义的Bean的创建在finishBeanFactoryInitialization(beanFactory)这个方法里面

Spring源码 之 Bean生命周期——基础篇_第2张图片

继续往里走进入preInstantiateSingletons方法的getBean方法里面

Spring源码 之 Bean生命周期——基础篇_第3张图片

然后就是doCreateBean方法,这个方法里面包含了先从缓存中获取Bean、单例Bean的创建、原型Bean的创建流程,我们进入到单例Bean的创建方法里面去

Spring源码 之 Bean生命周期——基础篇_第4张图片

继续往里走,来到createBean的doCreateBean方法

Spring源码 之 Bean生命周期——基础篇_第5张图片

在doCreateBean方法里面,主要完成了①Bean实例的创建、②、处理器修改合并bean定义、③、创建bean 把bean放入到singletonFactories、④、数据填充进实例、⑤、进行bean的初始化,执行后置处理器等,其他的就不再介绍,我们重点看④和⑤、进入到④ 的内部,发现有这么一段逻辑,遍历所有的后置处理器(如果开启AOP,则会执行aop的后置处理器生成代理就是在这里),如果是给属性赋值的后置处理器InstantiationAwareBeanPostProcessor类型,就执行这个后置处理器的后置方法postProcessPropertyValues,进入到这个方法里面则一目了然。

Spring源码 之 Bean生命周期——基础篇_第6张图片

然后接下来进入到initializeBean看初始化bean的逻辑

Spring源码 之 Bean生命周期——基础篇_第7张图片

初始化里面会做比较多的事情,首先会进行一些Aware接口的处理工作,然后是初始化前BeanPostProcessor.postProcessBeforeInitialization和初始化后postProcessAfterInitialization接口的调用,在这两个方法中间执行的是init操作,比如接口InitializingBean的afterPropertiesSet方法的调用和配置的init-method方法的调用

Spring源码 之 Bean生命周期——基础篇_第8张图片

初始化完成,如果我们实现了InitantiationAwarePostProcessor接口,再调用postProcessorAfterInstantiation方法基本上Bean的创建过程就完成了,这就是createBean的大致过程。

 

个人才疏学浅,信手涂鸦,spring框架更多模块解读相关源码持续更新中......

 

你可能感兴趣的:(Spring源码)