SpringBoot应用--03-Web Servlet启动内置Tomcat服务器

1. 实现类扩展的onRefresh|finishRefresh方法   

1.1 SpringBoot应用启动时,判断当前时Servlet类型的Web应用时,创建的ApplicationContext是AnnotationConfigServletWebServerApplicationContext

1.2 AnnotationConfigServletWebServerApplicationContext类继承了ServletWebServerApplication类

1.3 ServletWebServerApplicationContext类中的覆写的具体方法(onRefresh+finishRefresh)
    @Override // onRefresh方法用来准备内置的WebServer
    protected void onRefresh() {
        super.onRefresh();
        try {
            createWebServer();
        }catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();
        if (webServer == null && servletContext == null) {
            ServletWebServerFactory factory = getWebServerFactory();
            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();
    }
    protected ServletWebServerFactory getWebServerFactory() {
        // Use bean names so that we don't consider the hierarchy
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        if (beanNames.length == 0) {
            throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to missing "
                    + "ServletWebServerFactory bean.");
        }
        if (beanNames.length > 1) {
            throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to multiple "
                    + "ServletWebServerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));
        }
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
    
    // finishRefresh方法用来启动已经准备好的内置Tomcat服务器
    @Override
    protected void finishRefresh() {
        super.finishRefresh();
        WebServer webServer = startWebServer();
        if (webServer != null) {
            publishEvent(new ServletWebServerInitializedEvent(webServer, this));
        }
    }
    private WebServer startWebServer() {
        WebServer webServer = this.webServer;
        if (webServer != null) {
            webServer.start();
        }
        return webServer;
    }

 

posted @ 2021-07-02 17:10  521pingguo1314  阅读(166)  评论(0编辑  收藏  举报