前续
为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。
No.1 启动内嵌WEB服务器
在ApplicationContext的refresh()方法的第九步:onRefresh中会启动内嵌的应用服务器,具体代码如下:
在点击进去查看实现ServletWebServerApplicationContext.onRefresh(),其具体代码如下:
No.2 创建内嵌WEB服务器
跟进上面的代码,我们重点来看看创建WEB服务器:
ServletWebServerApplicationContext.createWebServer()其代码如下:
从该方法的代码中可以知道,创建WEB服务器主要有以下三个步骤:
获取ServletWebServerFactory
构建WEB服务器
初始化WEB服务器的环境配置
1、获取ServletWebServerFactory
首先来看看ServletWebServerFactory实例的获取,getWebServerFactory()方法的具体代码如下:
获取ServletWebServerFactory类型的beanNames
在本应用中beanNames = [tomcatServletWebServerFactory]
获取对应的BeanFactory
这里将获取beanName为tomcatServletWebServerFactory的ServletWebServerFactory类型的BeanFactory。
1.1、获取ServletWebServerFactory类型的beanNames
继续看其重载方法:
入参:
type = ServletWebServerFactory.class
includeNonSingletons = true //是否允许包含单例
allowEagerInit = true //是否允许早期初始化
根据入参值,我们知道,它接下来会调用doGetBeanNamesForType()方法,具体代码如下:
doGetBeanNamesForType()方法代码非常长,主要逻辑是:
遍历所有定义的Bean的名称
将匹配上指定类型的BeanName添加到结果对象result中
遍历所有定义的手动注册的单例Bean的名称
将匹配上指定类型的BeanNames添加到结果对象result中
将结果对象转换为字符串形式返回
在本应用中,执行完上述逻辑后,返回结果是:[tomcatServletWebServerFactory]
1.2、获取对应的BeanFactory
经过上一步,我们已经拿到了ServletWebServerFactory类型的beanNames的值[tomcatServletWebServerFactory],
接下来通过调用AbstractBeanFactory.getBean()方法,来获取对应的Bean,具体代码如下:
入参:
name = tomcatServletWebServerFactory
requiredType = ServletWebServerFactory.class
调用其内部的doGetBean方法,返回对应的bean。
2、构建WEB服务器
通过上面步骤,得到了ServletWebServerFactory后,调用其getWebServer()方法来构建WEB服务器:
3、初始化WEB服务器的环境配置
WEB服务器构建成功后,接下来就是初始化其环境配置:
具体来其代码实现:
No.3 小结
在本文中只是大致分析了SpringBoot内嵌的WEB服务器的启动过程,由于篇幅问题,还有很多具体细节没有分解,比如说:
为什么我们在构建应用时什么都没有配置,也能启动WEB服务器?
为什么默认情况下使用的是Tomcat服务器?
如何对内嵌的Tomcat服务器进行优化?
等问题将在后续文章中逐一解答。
后记
为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。
本系列历史文章列表
·end·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
领取专属 10元无门槛券
私享最新 技术干货