spring单例bean的创建流程

spring单例bean的创建流程

  • 简化创建流程图
    • 流程说明
  • 详细创建流程图

简化创建流程图

spring单例bean的创建流程_第1张图片

流程说明

1 当spring容器在启动的时候或者启动完成后显示调用getBean方法时来获取bean实例的时候,都会调用这个doGetBean方法

  • doGetBean方法首先通过调用getSingleton判断这个bean能不能拿到,如果可以直接返回;
  • doGetBean会根据不同的作用域,执行不同的操作,如单例、多例、request、session等

2 Bean的创建,主要是通过调用doCreateBean方法

  • 实例化,调用createBeanInstance方法
  • 属性注入,调用populateBean方法
  • 初始化,调用initializeBean方法

3 实例化,主要是通过调用createBeanInstance,又分两步:

  • 通过resolveBeanClass获取beanClass对象,如果此类之前加载过直接返回,如果没有加载过则通过ClassLoader加载;
  • 实例化,通过无参构造方式实例化或通过@Autowire注解的构造方法实例化

4 属性注入,主要是通过调用populateBean方法

  • 调用AutowiredAnnotationBeanPostProcessor#postProcessProperties
  • 通过AutowiredFieldElement或AutowiredMethodElement调用inject方法
  • bean注入最终又会调用getBean方法(循环依赖产生的地方)
  • 拿到bean对象后,通过反射完成属性注入

5 初始化,主要是通过调用initializeBean方法(初始化东西最多)

  • 调用实现Aware接口的方法:
    • 调用 BeanNameAware 的 setBeanName 方法
    • 调用 BeanClassLoaderAware 的 setBeanClassLoader
    • 调用 BeanFactoryAware 的 setBeanFactory 方法
    • 大部分在ApplicationContextAwareProcessor#postProcessBeforeInitialization方法中进行Aware接口的调用
  • 执行 BeanPostProcessor 的初始化前的方法
    • 调用 BeanPostProcessor 的postProcessBeforeInitialization方法
  • 调用普通初始化方法
    • 调用 afterPropertiesSet 方法
    • 调用 用户定义的初始化方法,即init-method 属性配置的方法
  • 执行 BeanPostProcessor 的初始化后的方法
    • 调用 BeanPostProcessor 的postProcessAfterInitialization方法

以上参考:https://www.cnblogs.com/caoxb/p/12861629.html

详细创建流程图

该图还未枝叶未画完,待续

你可能感兴趣的:(spring)