创建及初始化bean过程

概述

  1. 定义所有beanDefinitions
  2. 遍历这些beanDefinitions,创建bean,整个过程在doCreateBean()中
  3. 创建bean过程:先new对象,再注入属性,最后调用初始化方法(后处理器等)

详细过程


  • BeanDefinition载入、解析、注册
    1、找到配置文件Resource。
    2、将配置文件解析成BeanDefinition
    3、将BeanDefinition向Map中注册 Map
    通过上述三个步骤我们将配置在配置文件中的节点,全部封装到上述的Map中。为后续的getBean()打下了基础。
    这个过程大概可以理解为,
    1:找到原材料
    2:把原材料装进容器里
  • bean的实例化和依赖注入
    此过程由getBean()方法触发
创建及初始化bean过程_第1张图片
image.png
创建及初始化bean过程_第2张图片
image.png

创造 bean


创建及初始化bean过程_第3张图片
image.png

完成 创建bean

创建及初始化bean过程_第4张图片
image.png

最终创建bean, 根据bean定义,同时生成了注入属性,但值为null,还没注入属性对象。


创建及初始化bean过程_第5张图片
image.png

填充属性,实现依赖注入,bean中的依赖bean是在这里注入的!


创建及初始化bean过程_第6张图片
image.png

此过程根据上述的BeanDefition,

1:通过反射或者Cglib的方式创造bean
2:根据配置的依赖将所需要的bean注入进来,此过程会递归调用getBean()方法。
3:根据bean的scope决定是否缓存该Bean,一般情况为单例。容器会缓存该对象。

这个过程大概可以理解为

将原材料进行加工,创造可以直接利用的产品。

到此,spring容器就可以对外提供服务了。

bean注入属性bean过程


  • 填充bean属性


    创建及初始化bean过程_第7张图片
    image.png
  • 使用后处理器填充属性,这里会有多个后处理器,填充多种不同的属性。
    AbstractAutowireCapableBeanFactory.populateBean()


    创建及初始化bean过程_第8张图片
    image.png

多个填充属性后处理器


创建及初始化bean过程_第9张图片
image.png
  • 注解方式注入bean地方,终于找到了!
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues()

创建及初始化bean过程_第10张图片
image.png
  • xml方式注入bean地方,这里的属性都是xml里面配置的 property。
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues()

创建及初始化bean过程_第11张图片
image.png

调用初始化方法过程


创建对象时一共有四个地方可以让我们操作这个对象。


创建及初始化bean过程_第12张图片
image.png
  1. 首先调用织入方法
    织入方法会根据类型调对应方法。
    所以实现了对应接口就能获取到对应的对象了。


    创建及初始化bean过程_第13张图片
    image.png
  2. 调用初始化前后处理器
    实现了这个接口,就能够被调用到了。
    注意:所有bean都会调用这个后处理器,如果有多个后处理器,都会被调用,又饿order属性,可以控制这些后处理器的调用顺序。

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;

    Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
  1. 调初始化方法
    这里后先调用InitializingBean的afterPropertiesSet方法。
    再调我们自己配置的init方法,比如这样。

创建及初始化bean过程_第14张图片
image.png
  1. 调初始化后的后处理器
    和第2步一样。

你可能感兴趣的:(创建及初始化bean过程)