Spring Bean的生命周期(创建Bean的流程)

如果你正打算深入学习Spring,但是不知从何学起,那么我强烈推荐你可以按照这个系列做一遍。本系列将Spring框架的各个部分从它庞杂的代码体系中抽取出来,然后对每一个部分进行讲解,并最终搭建成简易版Spring。我以人格保证:如果你可以坚持做下来,那么你对Spring这块的知识就基本都掌握清楚了! 附上该系列地址:https://blog.csdn.net/zhang_qing_yun/article/details/120084497
# Bean的生命周期(创建Bean的流程)

简单来说,Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction。

img

  1. 首先是实例化Bean对象。这个过程是给Bean对象分配内存空间的过程,这时的bean的所有属性都是默认的零值。在实例化Bean之前,还会去执行BeanPostProcessor的postProcessBeforeInstantiation方法,Spring源码的注释中说这里是给BeanPostProcessor一个机会去返回一个代理对象,如果返回的对象不为空,那么先会去执行BeanPostProcessor的后置处理,然后直接返回,不再进行接下来的操作。在实例化Bean的过程中会根据构造器参数的个数、参数的类型去和通过反射获取到的构造器进行匹配,在匹配成功后会将匹配成功的构造器或工厂方法缓存在BeanDefinition的属性中,避免下次创建Bean的时候再次解析。在实例化对象时,Spring使用了策略模式,并提供了两种方式:一种是通过反射的方式,一种是通过Cglib(默认)的方式。实例化之后,会去执行BeanPostProcessor的postProcessMergedBeanDefinition方法,作用是允许在这里修改Bean的定义信息。然后为了解决循环依赖问题,会在第三级缓存中添加一个该Bean对象的ObjectFactory对象,进行提前暴露。
  2. 接下来是属性填充,依赖注入操作。首先会去执行实现了InstantiationAwareBeanPostProcessor接口的BeanPostProcessor的postProcessAfterInstantiation方法,作用是给BeanPostProcessor最后一次机会在属性注入前修改Bean的状态,如果返回false,则不会再继续接下来的属性填充操作。然后会去执行实现了InstantiationAwareBeanPostProcessor接口的BeanPostProcessor的postProcessPropertyValues方法,作用是在设置Bean对象的属性值之前,允许BeanPostProcessor修改属性值,注解方式的依赖注入就是在这里通过反射完成的注入。然后会去遍历BeanDefinition中的PropertyValues属性,对列表中的每一项,完成对Bean对象的属性设置。
  3. 然后是初始化操作。首先会去处理Aware接口(容器感知),如果该Bean实现了继承于Aware接口的某个接口,此时就会获取到有关于Spring的一些信息,比如说类加载器、BeanFactory等。然后去遍历所有的BeanPostProcessor,并执行其前置处理器。如果该Bean实现了InitializingBean接口或者通过配置文件/注解指定了初始化方法,就会去执行自定义的初始化方法。然后去遍历所有的BeanPostProcessor,并执行其后置处理器,AOP就是在这里实现的
  4. 这时候Bean对象就创建完成了,现在的Bean就是完整版的可以使用的Bean了。但是这时还会去再执行一次getSingleton操作,其原因就是如果在创建对象的过程中遇到了循环依赖加AOP的情况,这时我们创建完成的是Bean本身,而Bean的代理对象存在于二级缓存中,通过getSingleton操作就可以从二级缓存中获取到代理了完整版Bean的代理对象,这个代理对象才是我们最终需要的。如果这个Bean实现了DisposableBean接口或者通过配置文件/注解指定了销毁方法,这时就会将这个Bean注册到DefaultSingletonBeanRegistry中一个专门管理此类Bean的容器中。
  5. 最后是销毁阶段。在Spring容器关闭时,会去遍历注册在DefaultSingletonBeanRegistry中的所有待销毁对象,然后依次执行它们的销毁方法。

猜你喜欢

转载自blog.csdn.net/zhang_qing_yun/article/details/120072186