springboot启动流程之bean注册-源码分析(1)

1,断点进入主程序

springboot启动流程之bean注册-源码分析(1)_第1张图片

2,初始化组件

springboot启动流程之bean注册-源码分析(1)_第2张图片

其中实例化组件时,使用反射,如下图示

springboot启动流程之bean注册-源码分析(1)_第3张图片

初始完组建后,

接着是application的run方法

springboot启动流程之bean注册-源码分析(1)_第4张图片

在上面过程中,进入

context = this.createApplicationContext();

进入,默认创建一个

AnnotationConfigServletWebServerApplicationContext实例

return (ConfigurableApplicationContext)BeanUtils.instantiateClass(contextClass);

接着放开断点,继续,

进入this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

springboot启动流程之bean注册-源码分析(1)_第5张图片

上面设置context,

跳出后进入this.refreshContext(context);

进入super, AbstractApplicationContext初始化bean,

springboot启动流程之bean注册-源码分析(1)_第6张图片

 

此时beanmap有7个元素,即以注册了7个beanpostprocessor

springboot启动流程之bean注册-源码分析(1)_第7张图片

而实例对象才3个

springboot启动流程之bean注册-源码分析(1)_第8张图片

接着对于

invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) 

springboot启动流程之bean注册-源码分析(1)_第9张图片

进入postprocessor,每个processor注册其他bean

springboot启动流程之bean注册-源码分析(1)_第10张图片

接着走,如下

springboot启动流程之bean注册-源码分析(1)_第11张图片

 

由于 String[] candidateNames = registry.getBeanDefinitionNames();如上示,一一使用processor注册其他bean,

springboot启动流程之bean注册-源码分析(1)_第12张图片

此时加入了注册启动类bean,为8个,

断点进入如下图示,先注册启动类bean,如下

springboot启动流程之bean注册-源码分析(1)_第13张图片

此展开如下

springboot启动流程之bean注册-源码分析(1)_第14张图片

 

 

解析demoapplication时,如下

springboot启动流程之bean注册-源码分析(1)_第15张图片

进入断点

springboot启动流程之bean注册-源码分析(1)_第16张图片

接着进入

springboot启动流程之bean注册-源码分析(1)_第17张图片

往下走

进入此方法,出现CompanScan(重点)

springboot启动流程之bean注册-源码分析(1)_第18张图片

应该是包扫描,寻找待注册的类

进入

springboot启动流程之bean注册-源码分析(1)_第19张图片

进入这个方法最后

开始根据包名,扫描注册

springboot启动流程之bean注册-源码分析(1)_第20张图片

接着看具体实现

springboot启动流程之bean注册-源码分析(1)_第21张图片

出现类的路径模式了

springboot启动流程之bean注册-源码分析(1)_第22张图片

至于如何找到resource数组,暂时流程就是扫描各个包,判断各个.class, 若有Service,controller等注解,说明是candidates,待注入的beandefinitations!!!!,也可以打断点进入,这里不再详述。

看下resource[]数组

springboot启动流程之bean注册-源码分析(1)_第23张图片

,接着循环逐个add即可,首先找到了controller

springboot启动流程之bean注册-源码分析(1)_第24张图片

然后注册controller(add)

springboot启动流程之bean注册-源码分析(1)_第25张图片

后面也有mapper及entity被扫描到并添加z注册到到beandefinitions

springboot启动流程之bean注册-源码分析(1)_第26张图片

springboot启动流程之bean注册-源码分析(1)_第27张图片

springboot启动流程之bean注册-源码分析(1)_第28张图片

 

这里着重关注下

registerBeanPostProcessors();

打断点,进入此方法

springboot启动流程之bean注册-源码分析(1)_第29张图片

默认加载10种beanPostProcessorName,注册并创建对应beanPostProcessor实例,getbean就是创建实例并注册,如下图,

springboot启动流程之bean注册-源码分析(1)_第30张图片

这里注意创建annoautowiredbeanpostprocessor

springboot启动流程之bean注册-源码分析(1)_第31张图片

接着,跳出后

springboot启动流程之bean注册-源码分析(1)_第32张图片

this.onRefresh();

springboot启动流程之bean注册-源码分析(1)_第33张图片

对于

createWebServer()

springboot启动流程之bean注册-源码分析(1)_第34张图片

 

接着跳出,

this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();

springboot启动流程之bean注册-源码分析(1)_第35张图片

你可能感兴趣的:(spring,springboot)