我的文章-Spring

创建及初始化bean过程

2018-08-06  本文已影响4人  飞翔的鲲

概述

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

详细过程


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过程


多个填充属性后处理器


image.png
image.png
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步一样。
上一篇 下一篇

猜你喜欢

热点阅读