SpringBean生命周期

1.跟普通的对象不一样。传统的对象创建有几个步骤

  • 编译为class文件
  • 等类需要初始化的时候加载到JVM里面,如遇到new 反射(主动引用)
  • 初始化供我们使用

而BeanDefinition还有不同的点就是,还增加了一些对Bean对象的描述信息,比如@Scorpe,@Lazy

2.Bean在启动的时候会扫描在XML、注解中需要被Bean管理的信息,并把它们封装在一个beanDefinitionMap中,这个Map的key是beanName, Value是BeanDefinition对象,到这里其实是把定义的元数据加载起来。真实的对象还没有实例化。

1
3.接下来会遍历这个Map,执行一个BeanFactoryPostProcessor的工厂后置处理器。比如说我们的占位符信息,就是在这一步进行注入的。

4.下一步就是实例化对象了,Spring里是采用反射,选择合适的构造器把对象实例化,但此时的对象具体的属性还没有注入。

5.下一步是注入属性。

6.注入完了开始初始化的工作。就首先判断Bean是否实现了Aware相关的接口,实现了就填充相关的资源。

7.接口处理完就到了BeanPostProcessor的后置处理器,主要有两个方法,一个是Before, 一个是After。

8.这个后置处理器也是AOP实现的关键。

执行Before

随后执行init相关的方法,比如PostConstruct,实现InitializingBean接口,定义的init-method方法

执行After

9.随后如果要销毁的话就查看有没有配置相关的destroy方法。

属性的注入在构造器执行完之后。三级缓存,三个Map。

singletonObjects(一级,日常获取Bean的地方)

earlySingletonObjects(二级,已实例化,还没有属性注入,由三级缓存放进来 Value就是Bean)

singletonFactories(三级,Value是一个对象工厂)

A实例完后,属性注入前会先把自己放入三级缓存。Key是BeanName, Value是ObjectFactory

B发现自己依赖A,会去三级缓存找,找到后把A提升到二级缓存,自身顺利初始化。

A顺利会把自身给提升到一级缓存。

为什么是三级

因为当A是一个被AOP增强的对象时。在使用了三级缓存的情况下为A创建代理的时机是在B中需要注入A的时候,因为Value值是一个objectFactory.而不使用三级缓存的话在A实例化后就需要马上为A创建代理然后放入到二级缓存中去

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

关键源码方法(强烈建议自己去撸一遍)

  • org.springframework.context.support.AbstractApplicationContext#refresh(入口)
  • org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization(初始化单例对象入口)
  • org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons(初始化单例对象入口)
  • org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)(万恶之源,获取并创建Bean的入口)
  • org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean(实际的获取并创建Bean的实现)
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)(从缓存中尝试获取)
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])(实例化Bean)
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean(实例化Bean具体实现)
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance(具体实例化过程)
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory(将实例化后的Bean添加到三级缓存)
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean(实例化后属性注入)
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)(初始化入口)

去网上看博客的时候,找到了几张比较好的图,这里贴下方便大家理解吧~

图片

图片

图片

来源:https://www.jianshu.com/p/6c359768b1dc