Spring源码分析-bean创建(流程图)

bean的生命周期把它总结为以下几个阶段
  • 实例化
  • 属性注入/依赖注入
  • 初始化
  • 销毁
其中实例化、属性注入、初始化属于bean创建的过程。

bean创建的过程流程图
(1)当spring容器在启动的时候或者启动完成后显示调用getBean方法时来获取bean实例的时候,都会调用这个doGetBean方法
  • doGetBean方法首先通过调用getSingleton判断这个bean能不能拿到,如果可以直接返回;
  • doGetBean会根据不同的作用域,执行不同的操作
 
(2)Bean的创建,主要是通过调用doCreateBean方法
  1. 实例化,调用createBeanInstance方法
  2. 属性注入,调用populateBean方法
  3. 初始化,调用initializeBean方法
 
(3)实例化,主要是通过调用createBeanInstance,又分两步:
  1. 通过resolveBeanClass获取beanClass对象,如果此类之前加载过直接返回,如果没有加载过则通过ClassLoader加载;
  2. 实例化,通过无参构造方式实例化或通过@Autowire注解的构造方法实例化
 
(4)属性注入,主要是通过调用populateBean方法
  1. 通过AutowiredFieldElement或AutowiredMethodElement调用inject方法
  2. bean注入最终又会调用getBean方法(循环依赖产生的地方)
  3. 拿到bean对象后,通过反射完成属性注入
 
(5)初始化,主要是通过调用initializeBean方法(初始化东西最多)
         5.1 调用实现Aware接口的方法:
  • 调用 BeanNameAware 的 setBeanName 方法
  • 调用 BeanClassLoaderAware 的 setBeanClassLoader
  • 调用 BeanFactoryAware 的 setBeanFactory 方法
        5.2 执行 BeanPostProcessor 的预初始化方法
  • 调用 EnvironmentAware 的 setEnvironment 方法
  • 调用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
  • 调用 ResourceLoaderAware 的 setResourceLoader 方法
  • 调用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法
  • 调用 MessageSourceAware 的 setMessageSource 方法
  • 调用 ApplicationContextAware 的 setApplicationContext 方法
  • 调用 BeanPostProcessor 的预初始化方法
       5.3 调用普通初始化方法  
  • 调用 afterPropertiesSet 方法
  • 调用 用户定义的初始化方法,即init-method 属性配置的方法
注意:上面初始化方法从上至少是按照顺序执行的
posted @ 2020-05-10 01:31  cao_xiaobo  阅读(3357)  评论(0编辑  收藏  举报