述
上文中大致了解了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实例的流程图:
短路操作流程图: