Spring Boot-7-Bean实例化流程

上文中大致了解了Spring容器的refresh的过程,其中 finishBeanFactoryInitialization() 方法没有详细说明, 这个方法就是 Spring 容器实例化 Bean 的方法, 下面来详细看一下这个方法

Spring容器Bean实例化流程

首先,进入 finishBeanFactoryInitialization() 方法

image

继续往下, 进入 preInstantiateSingletons() 方法

image

初始化Bean

bean初始化调用的是 AbstractBeanFactory.getBean(),最终调用的是 AbstractBeanFactory.doGetBean()

进入看下源码:

image

image

image

image

前面都是一系列的检查,然后最后判断一下是否是单例,然后调用 getSingleton() 方法,进入这个方法看一下

image

返回上一个方法,进入 AbstractAutowireCapableBeanFactory.createBean() 方法

image

我们先进入 resolveBeforeInstantiation() 这个方法,看一下他具体是怎么处理的

image

这个方法是实例化之前的处理, 给 InstantiationAwareBeanPostProcessor 一个机会返回代理对象来替代真正的 bean 实例,从而跳过 Spring 默认的实例化过程, 达到”短路”效果.

这里会执行 InstantiationAwareBeanPostProcessorpostProcessBeforeInstantiation 方法,该方法可以返回 bean 实例的代理,从而跳过 Spring 默认的实例化过程,具体代码在 applyBeanPostProcessorsBeforeInstantiation()中, 如下:

image

然后这个方法如果返回了bean,就会进入 applyBeanPostProcessorsAfterInitialization() 方法做一些后置处理,如下:

image

在这个过程中,如果没有返回Bean的实例,那么就会走 Spring 的默认的实例化流程,也就是上面 AbstractAutowireCapableBeanFactory.doCreateBean() 方法

image

主要部分就是这些,后面是处理一些 @Autowired 注解注入的值,还有一些后置处理器等等

总结

Spring 默认创建Bean实例的流程图:
image

短路操作流程图:
image