spring-boot源码分析之beanDefinitionNames · 壹

云中志

共 1779字,需浏览 4分钟

 · 2021-09-06


前言

今天原本打算搞清楚spring boot初始化scan的流程的,但是在调试过程中,发现压根就没有执行scan方法,这个方法只有basePackage不为空的时候才会执行,起初我以为是需要在@SpringBootApplication指定包路径才可以,但是加了之后发现还是没用,所以最后就暂时放弃了:

然后我就不知道该分享什么了……

但是最后我在debug的时候,发现beanFactory有个 beanDefinitionNames的成员变量,它的元素数量会在reflush方法执行之后急剧增加,同时也有个与之对应的成员变量beanDefinitionMap元素数量和它一致,也是在reflush之后数据量增多,而且从名字也可以看出来他们和spring bean相关的组件,另外他们所存储的数据包含了我自己定义的服务:

所以最后我决定沿着beanFactorybeanDefinitionNames的初始化路线,看下这些数据到底是如何初始化的,希望最后能更接近spring boot初始化的核心秘密,于是就有了今天的内容。

beanDefinitionNames

开始分享beanDefinitionNames相关知识点之前,我们先补充一个知识点——spring boot默认容器。从创建容器的源码我们可以看出,在不指定容器类别的情况下,spring boot默认为我们创建的容器是AnnotationConfigServletWebServerApplicationContext(在此之前,我一直以为它走的是default那块的代码,debug之后发现我理解错了),这个默认容器本身是继承了ServletWebServerApplicationContext,所以说默认情况下,spring boot为我们创建的是servlet容器:

好了,默认容器的相关知识点我们先补充这么多,下面我们开始beanDefinitionNames的相关内容分享。

首先,我们先介绍下beanDefinitionNames。从上面的debug截图中我们其实可以看出来一些信息,beanDefinitionNames其实就是存放spring bootbean的名字的,通过这个名字我们就可以从spring boot的容器中拿出我们bean的实例:

这也就是说,beanDefinitionNames就是spring bootIOC容器的名单,通过这个名单我们可以找到容器中的每一个类。

关于beanDefinitionNames我们暂时就先说这么多,等后面分析BeanFactory的时候我们到时候再来补充。下面我们来看下面这张时序图:

时序图svg原图地址如下:

https://gitee.com/sysker/picBed/raw/master/%E5%AE%B9%E5%99%A8%E5%88%B7%E6%96%B0%E5%90%AF%E5%8A%A8%E6%97%B6%E5%BA%8F%E5%9B%BE.svg

这张时序图比较清楚地展示了spring boot初始化beanFactorybeanDefinitionNames的过程(beanDefinitionMap的初始化也是如此),但关于这张时序图我感觉我能说的很少,虽然调用过程很清晰,但我目前还没有梳理清楚各个方法的作用(初始化过程所起的作用),因为每一个方法除了我这里罗列的方法调用外,还有很多其他的操作,而且由于时间关系,今天也没有时间梳理了,目前的计划是明天把这块的内容补上,然后尽可能再多扩充一些新的知识。

总结

实话说,spring boot的源码是真的难啃,从我自己的感觉,以及产出成果来说,确实是太难了,不仅进度慢,难出成果,而且出来的东西也确实没有以前分享demo或者其他内容那么顺畅,现在的感觉就像是在乱石堆里挖井,挖半天下不去,自己还累的够呛,但是把,万事开头难,等所有内容都梳理的七七八八了,我相信一切都会变的顺畅起来的,所以接着啃呗

- END -
浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报