zoukankan      html  css  js  c++  java
  • Spring Boot web容器启动

    一、启动前的准备:

    1、SpringApplication构造方法,赋值webApplicationType

    Debug启动项目后,进入SpringApplication构造函数,里面有个webApplicationType

    2、根据classpath下是否存在特定类来决定哪种类型,分别为SERVLET, REACTIVE, NONE

     deduceFromClasspath方法返回webApplicationType为Servlet

    3、然后进入run方法,进入创建应用程序上下文方法createApplicationContext

    根据webApplicationType,是SERVLET.   创建应用程序上下文返回AnnotationConfigServletWebServerApplicationContext实例。

    二、webServer创建入口

    1、进入run方法

    2、 然后进入refreshContext方法

    3、 进入refresh方法

    4、进入((AbstractApplicationContext) applicationContext).refresh(); 

    5、 进入super.refresh()

    6、 进入onRefresh方法。里面有一个创建webServer方法。

     三、webServer创建

    1、 进入createWebServer方法

        1)、 进入getWebServerFactory方法

      2)、 进入getBean方法

      3)、进入doGetBean方法。beanName为tomcatServletWebServerFactory

      然后进入doGetBean的如下代码  createBean来创建tomcatServletWebServerFactory

    2、然后进入this.webServer = factory.getWebServer(getSelfInitializer());

      a) 进入getWebServer方法

     首先实例化一个tomcat。然后设置一些tomcat相关的属性。相关属性介绍可以参考Tomcat介绍

    然后进入返回getTomcatWebServer(tomcat)

    	protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
    		return new TomcatWebServer(tomcat, getPort() >= 0);
    	}
    

      

    b)进入实例化TomcatWebServer方法

    	public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
    		Assert.notNull(tomcat, "Tomcat Server must not be null");
    		this.tomcat = tomcat;
    		this.autoStart = autoStart;
    		initialize();
    	}
    

      通过initializer初始化tomcat的一些属性值

    3、进入createWebServer里的initPropertiesSources方法

    进入initPropertiesSources方法

    如果sources已经存在servletContextInitParams,则对其进行替换。

     这样就完成了tomcat服务的创建

    四、servlet启动

    1、 onRefresh执行完成后,然后进入refresh里面的finishRefresh方法

     a)进入finishRefresh方法

    	protected void finishRefresh() {
    		super.finishRefresh();
    		WebServer webServer = startWebServer();
    		if (webServer != null) {
    			publishEvent(new ServletWebServerInitializedEvent(webServer, this));
    		}
    	}

    启动webServer后,发布ServletWebServerInitializedEvent事件。  

    b)进入startWebServer

    	private WebServer startWebServer() {
    		WebServer webServer = this.webServer;
    		if (webServer != null) {
    			webServer.start();
    		}
    		return webServer;
    	}
    

      

    c)进入webServer.start()

    	public void start() throws WebServerException {
    		synchronized (this.monitor) {
    			if (this.started) {
    				return;
    			}
    			try {
    				addPreviouslyRemovedConnectors();
    				Connector connector = this.tomcat.getConnector();
    				if (connector != null && this.autoStart) {
    					performDeferredLoadOnStartup();
    				}
    				checkThatConnectorsHaveStarted();
    				this.started = true;
    				logger.info("Tomcat started on port(s): " + getPortsDescription(true) + " with context path '"
    						+ getContextPath() + "'");
    			}
    			catch (ConnectorStartFailedException ex) {
    				stopSilently();
    				throw ex;
    			}
    			catch (Exception ex) {
    				throw new WebServerException("Unable to start embedded Tomcat server", ex);
    			}
    			finally {
    				Context context = findContext();
    				ContextBindings.unbindClassLoader(context, context.getNamingToken(), getClass().getClassLoader());
    			}
    		}
    	}
    

      启动后控制台输出

     Tomcat started on port(s): 8080 (http) with context path 

  • 相关阅读:
    Java学习第六篇:集合类
    Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
    Java学习第四篇:数组,排序,查找
    Java学习第三篇:类的三大特征,抽象类,接口,final关键字
    Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法
    Java学习第一篇:变量,数据类型,运算符,流程控制(简介)
    (转)学习使用Jmeter做压力测试(三)--数据库测试
    (转)学习使用Jmeter做压力测试(一)--压力测试基本概念
    Xcode-项目模板修改
    过程式编程 drawShapes
  • 原文地址:https://www.cnblogs.com/linlf03/p/12416098.html
Copyright © 2011-2022 走看看