SpringBoot源码分析之内嵌servlet容器[4]

  1. 内嵌servlet容器创建与启动

本章主要分析SpringBoot的另一大特性:内嵌servlet容器。

SpringBoot提供了对内嵌Tomcat、Jetty、Undertow的支持。

内嵌servlet容器创建与启动

内嵌servlet容器是在容器的刷新过程中创建并启动的。

详情请参照本系列第二章中AbstractApplicationContext类的refresh方法中调用的onRefresh方法。

onRefresh方法由具体的子类覆盖。

对于servlet类型的容器来说,onRefresh方法在ServletWebServerApplicationContext类中被覆盖。

protected void onRefresh() {
    super.onRefresh();
    try {
        createWebServer();
    }
    catch (Throwable ex) {
        throw new ApplicationContextException("Unable to start web server", ex);
    }
}

private void createWebServer() {
    // 获取当前的webServer
    WebServer webServer = this.webServer;
    // 获取当前的servlet容器
    ServletContext servletContext = getServletContext();
    // 刚开始时都为null
    if (webServer == null && servletContext == null) {
        // 这里默认拿到的是TomcatServletWebServerFactory的实例
        // JettyServletWebServerFactory
        // 和UndertowServletWebServerFactory通常也是一种选择
        ServletWebServerFactory factory = getWebServerFactory();
        // 默认拿到的是TomcatWebServer的实例
        this.webServer = factory.getWebServer(getSelfInitializer());
    }
    else if (servletContext != null) {
        try {
            getSelfInitializer().onStartup(servletContext);
        }
        catch (ServletException ex) {
            throw new ApplicationContextException("Cannot initialize servlet context", ex);
        }
    }
    initPropertySources();
}

在本项目的pom文件中,作者引入了spring-boot-starter-web依赖,spring-boot-starter-web使用的是Tomcat作为默认的内嵌servlet容器。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 504537531@qq.com

文章标题:SpringBoot源码分析之内嵌servlet容器[4]

文章字数:272

本文作者:YF

发布时间:2019-10-14, 15:24:29

最后更新:2019-10-15, 17:08:01

原始链接:https://zhouyufan0568.github.io/2019/10/14/springboot-embedded-servlet-container/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录