在开篇里面先写一个总览肯定是有助于理解整个Spring Bean生命周期的流程的,根据流程去理解一定会事半功倍。
比如我们生产可乐,就会有一个制造可乐的可乐工厂。当然 Spring 生成 bean 也有一个beanFactory。生产可乐还需要原材料比如蔗糖和碳酸,还有机器和设备。生成 bean 也需要原数据,这个元数据可以理解成 beanDefinition,还有beanFactory工厂的机器和设备,在此称之为beanFactory的属性。
Spring Bean 生命周期一共分为两部分,第一个初始化beanFactory,有了工厂就可以生产出bean对象了,那么第二部分就是正真的去产出可乐了。
真正哪两个部分呢
beanFactory的初始化 -- BeanFactoryPostProcessor 和 bean的初始化 -- BeanPostProcessor
beanFactory的初始化有一种很关键的处理器 叫BeanFactoryPostProcessor 这种处理器完成了很多初始化工作,包括填充属性,扫描,提供可扩展接口和解析工作。
bean的初始化也有一种很关键的处理器 叫BeanPostProcessor 这种处理器在beanFactory初始化完成后开始了bean的一生。
为什么叫这种处理器呢,因为这种处理器有很多,在源码中 BeanFactoryPostProcessor 和 BeanPostProcessor 都是接口,所以实现类很多,每个实现类的分工不同,所以对应着生命周期的每一步。
另外一个容器的概念如各种 applicationContext 它实际上是beanFactory的一个子类,正常子类的功能只会更多,当然 Spring的也不例外。
通俗一点的说,Spring 初始化 bean的流程很简单 就是将一个JavaBean对象 经过beanFactory的处理器 变成 一种类型的 BeanDefinition 对象 再经过bean的处理器生产 一个SpringBean 对象。变成BeanDefinition 的过程,我们形象的成为注册成一个 BeanDefinition 的过程。
根据上面介绍的内容我们来看看下面这张图
图里面的理解呢也是分为两部分,第一部分容器的初始化,容器经过BeanFactoryPostProcessor 将一个JavaBean 从扫描到解析最后注册成一个BeanDefinition 再经过 BeanPostProcessor 将 BeanDefinition 生成一个 SpringBean 。生成SpringBean的过程的每一步 是由不同的BeanPostProcessor来处理的,每一步也很好理解,完全不用死记硬背,我们按照自己的想法来分析一下看看。
一个BeanDefinition 变成 一个SpringBean的过程
第一步是先处理aop 这个过程呢是处理了aop的通知,会将aop的通知解析后存起来,这个时候还没有给代理对象绑定通知。
第二步实例化对象,在Java 里面每通过new 关键字就会通过某个构造方法去实例化一个Java对象,此时的对象是一个空对象(没有属性)。
第三步填充属性,当空对象被new 出来以后,给对象属性赋值完成后,一个正真意义的Java 对象就出来了
PS:第二步和第三步有技术点,就是推断一个构造方法去实例化,和循环依赖(构造方法的循环依赖和属性注入的循环依赖),由于属性注入是在实例化之前完成的,所以构造方法是无法解决循环依赖的问题。
第四步调用aware接口执行aware方法。就是填充实现aware接口方法参数的填充。此处源码里面内置的只有三种。
第五步执行初始化之前的方法,再次执行aware接口还是一样的源码里面填充了几种aware接口 如 applicationContextAware 接口。注意此处会调用@PostConstruct注解修饰的方法(可以理解为一种初始化方法)
第六步执行初始化方法 如xml里面bean便签属性 init-method指定的方法 和 实现了 InitializingBean 接口重写的方法。存在多种初始化执行起来是有顺序的但是如果存在@PostConstruct注解修饰的方法肯定是第一个执行,然后是实现了 InitializingBean 接口重写的方法,最后是init-Method执行的方法
第七步执行初始化之后的方法,这一步完成的aop通知的绑定以及代理对象的生成
最后就是调用销毁方法,至此一个SpringBean就这样生成出来了。
SpringBean的生命周期你会了吗
手写框架gitee地址:https://gitee.com/wanganfen/xx-spring/tree/master
手写 Spring 框架大致功能的介绍:
1.SpringBean的生命周期
2.可扩展 SpringMVC的接口,如 InitializingBean 和 applicationContextAware
3.可扩展Mybatis的接口 ,如 FactoryBean
Spring 源码理解语雀笔记地址:https://www.yuque.com/nimeng-d4z9s/aztl65/zgr8sm