述
上文中大致了解了Spring容器的refresh的过程,其中 finishBeanFactoryInitialization() 方法没有详细说明, 这个方法就是 Spring 容器实例化 Bean 的方法, 下面来详细看一下这个方法
Spring容器Bean实例化流程
首先,进入 finishBeanFactoryInitialization() 方法
继续往下, 进入 preInstantiateSingletons() 方法
初始化Bean
bean初始化调用的是 AbstractBeanFactory.getBean(),最终调用的是 AbstractBeanFactory.doGetBean()
进入看下源码:
前面都是一系列的检查,然后最后判断一下是否是单例,然后调用 getSingleton() 方法,进入这个方法看一下
返回上一个方法,进入 AbstractAutowireCapableBeanFactory.createBean() 方法
我们先进入 resolveBeforeInstantiation() 这个方法,看一下他具体是怎么处理的
这个方法是实例化之前的处理, 给 InstantiationAwareBeanPostProcessor 一个机会返回代理对象来替代真正的 bean 实例,从而跳过 Spring 默认的实例化过程, 达到”短路”效果.
这里会执行 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法,该方法可以返回 bean 实例的代理,从而跳过 Spring 默认的实例化过程,具体代码在 applyBeanPostProcessorsBeforeInstantiation()中, 如下:
然后这个方法如果返回了bean,就会进入 applyBeanPostProcessorsAfterInitialization() 方法做一些后置处理,如下:
在这个过程中,如果没有返回Bean的实例,那么就会走 Spring 的默认的实例化流程,也就是上面 AbstractAutowireCapableBeanFactory.doCreateBean() 方法
主要部分就是这些,后面是处理一些 @Autowired 注解注入的值,还有一些后置处理器等等
总结
Spring 默认创建Bean实例的流程图:
短路操作流程图: