1. 元数据配置阶段

  1. Bean Definition的加载包括三类
  • XmlBeanDefinitionReader
  • PropertiesBeanDefinitionReader
  • AnnotatedBeanDefinitionReader

getBean(id)

  1. 初始化BeanDefinition执行合并:getMergedBeanDefinition方法
  • BeanDefinition常见的有两种:在BeanDefinitionBuilder里面可以看到对应的创建方法
  • RootBeanDefinitionBean 无parent 设置parent会报错
  • GenericBeanDefinitionBean 普通的BeanDefinition
    • 初始化的时候都会为GenericBeanDefinition,但是如果没有parentBean 经过mergedBeanDefinition 就会变成RootBeanDefinition。
    • 如果他有parentBean,会把parentBean 的beanDefinition复制一份,然后进行合并BeanDefinition,子的去覆盖父类一定定义的properties。变成RootBeanDefinition

createBean

  1. BeanDefinition加载:doResolveBeanClass(mbd,typeToMatch) 第二个参数是指定类型去匹配
  • 里面回去调用AbstractBeanDefinition里面的resolveBeanClass(ClassLoader) 通过ClassLoader把Bean的Class<?> 获取返回。

以上是从BeanDefinition变成Class的Bean类加载过程,随后就是实例化过程

  1. 实例化前的一个非主流生命周期回调:
  • resolveBeforeInstantiation回去调用下面的接口方法返回非空就会执行
  • InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(beanClass, beanName)
    • 继承至自BeanPostProcessor的子接口
    • 可以根据beanClass和beanName去return一个Bean去替代BeanDefinition所描述的对象。

doCreateBean(beanName, rootBeanDefinition, args) args是可空的,支持有参和无参构造。

  1. 实例化
  • 传统实例化方式:
    • 实例化策略:InstantiationStrategy
  • 构造器注入

先回经过一个决定使用哪个构造器来Instantiate对象,通常返回空,这个是个拓展点需要实现
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstrcutors(beanClass, beanName)

调createBeanInstance

—> if preferedConstructors || autowire_constructor || hasConstructorArgs || args != null
return autowireConstructor(beanName, mbd, ctors, null )构造器注入的方式

—>return instantiateBean(beanName, mbd) 无参构造器的方式
根据策略创建对象包装成一个BeanWrapper

  • CglibSubclassingInstantiationStrategy生成一个子类实现
  • 默认用SimpleInstantiationStrategy 会使用构造器创建
  • 如果用的是无参构造所有的对象属性全为空

2. SpringBean的初始化

parent Class Construct > Current Class Construct > postConstruct > afterPropertiesSet > initMethod

  • Bean的初始化调用过程:
    • @PostConstruct标注的方法 在BeforeInitialization中执行 (需要CommonAnnotationBeanPostProcessor支持)
    • 实现InitializingBean接口的afterPropertiesSet()方法
    • 自定义初始化方法(initMethod)
      • SpringBean初始化中:initialize
      • SpringBean初始化后 postProcessAfterInitialization
      • SpringBean初始化完成:
  • Spring4.1+: SmartInitializingSingletton#afterSingletonsInstantiated()直接启动BeanFactory不会被回调,需要被显示执行,是在DefaultListableBeanFactory中的preInstantiateSingletons中执行的。

    3. SpringBean销毁

  • DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
  • 需要被beanFactory#destoryBean,才能回调
  • 销毁并不意味着Bean被垃圾回收了。
  • 销毁阶段

    • @PreDestroy
    • 实现DisposableBean接口的destory()的方法
    • 自定义销毁方法

      4. SpringBean GC回收

  • 关闭Spring容器(应用上下文)

  • 执行GC
  • SpringBean覆盖fianlize()方法被回调