创建及初始化bean过程

概述

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

详细过程


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

创造 bean


image.png

完成 创建bean

image.png

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


image.png

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


image.png

此过程根据上述的BeanDefition,

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

这个过程大概可以理解为

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

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

bean注入属性bean过程


  • 填充bean属性


    image.png
  • 使用后处理器填充属性,这里会有多个后处理器,填充多种不同的属性。
    AbstractAutowireCapableBeanFactory.populateBean()


    image.png

多个填充属性后处理器


image.png
  • 注解方式注入bean地方,终于找到了!
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues()

image.png
  • xml方式注入bean地方,这里的属性都是xml里面配置的 property。
    CommonAnnotationBeanPostProcessor.postProcessPropertyValues()

image.png

调用初始化方法过程


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


image.png
  1. 首先调用织入方法
    织入方法会根据类型调对应方法。
    所以实现了对应接口就能获取到对应的对象了。


    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 class="com.ymm.trade.es.utils.MyBeanPostProcessor" init-method="init"/>
image.png
  1. 调初始化后的后处理器
    和第2步一样。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容