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; }