Spring Bean生命周期总览

在开篇里面先写一个总览肯定是有助于理解整个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值