详解SpringBoot内嵌WEB服务器的启动过程

前续

为帮助广大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·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180716G1NIZ400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券