天天看點

SpringBoot 内置 Tomcat 啟動過程及原理

作者:網際網路技術學堂

介紹

SpringBoot是一個快速建構Java應用程式的架構,它通過内置Tomcat等容器,提供了一種簡單的方式來啟動和運作Java Web應用程式。本文将介紹SpringBoot内置Tomcat的啟動過程及原理。

SpringBoot内置Tomcat

SpringBoot通過使用嵌入式Servlet容器,使得我們不需要部署war包到外部容器中,而是将應用程式作為一個可執行的Jar包直接運作。内置Tomcat是SpringBoot中最常用的嵌入式Servlet容器之一,其它的嵌入式Servlet容器還包括Jetty、Undertow等。

Tomcat的啟動過程

Tomcat啟動的過程分為三個階段:初始化階段、配置階段和啟動階段。

  • 初始化階段

在初始化階段,Tomcat會建立和初始化容器。容器包括了一個Server對象和一組Service對象。Server對象是整個Tomcat的根對象,它代表了Tomcat伺服器的本身。Service對象表示了Tomcat的服務,包括了Connector和Engine等。

  • 配置階段

在配置階段,Tomcat會讀取server.xml檔案,并建立相應的對象。server.xml檔案是Tomcat的主配置檔案,包含了所有的配置資訊,包括端口、協定、日志、虛拟主機等。

  • 啟動階段

在啟動階段,Tomcat會根據配置檔案中的資訊,啟動Connector和Engine,并為每個Connector建立一個Acceptor線程和多個Worker線程。Acceptor線程用于接收用戶端請求,Worker線程用于處理用戶端請求。

SpringBoot内置Tomcat的啟動過程

SpringBoot内置Tomcat的啟動過程和Tomcat的啟動過程類似,也分為三個階段:初始化階段、配置階段和啟動階段。

  • 初始化階段

在SpringBoot啟動時,它會首先建立SpringApplication對象,并調用其run()方法。run()方法中會建立一個ConfigurableApplicationContext對象,并加載配置檔案和Spring Bean。

  • 配置階段

在配置階段,SpringBoot會讀取配置檔案,并根據配置檔案中的資訊,建立和配置Tomcat容器。SpringBoot中使用的Tomcat容器是TomcatEmbeddedServletContainerFactory類的執行個體。TomcatEmbeddedServletContainerFactory類繼承了EmbeddedServletContainerFactory類,并提供了一些特定于Tomcat的配置。

  • 啟動階段

在啟動階段,SpringBoot會根據TomcatEmbeddedServletContainerFactory的配置資訊,建立和啟動Tomcat容器,并為每個Connector建立一個Acceptor線程和多個Worker線程。

SpringBoot 内置 Tomcat 啟動過程及原理

Tomcat的工作原理

Tomcat容器的工作原理是基于Java Servlet規範的。當Tomcat接收到一個用戶端請求時,它會先經過Connector,當Tomcat接收到一個用戶端請求時,它會先經過Connector,Connector會負責将請求封裝成一個Request對象,并将其傳遞給Engine。Engine根據Request對象中的資訊,将請求交給對應的Host對象處理。Host對象會根據Request對象中的資訊,将請求交給對應的Context對象處理。

Context對象是Tomcat中最重要的對象之一,它代表了一個Web應用程式。當Context接收到請求後,會根據請求的URL路徑找到對應的Servlet,并将請求交給該Servlet處理。Servlet會根據請求的資訊,生成一個Response對象,并将其傳回給Context。

Context會将Response對象交給Connector,Connector會将Response對象發送給用戶端。

以下是一段使用SpringBoot内置Tomcat的代碼示例:

@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
}
@Bean
public ServletWebServerFactory servletContainer() {
return new TomcatServletWebServerFactory();
}
}           

當Tomcat接收到一個用戶端請求時,它會先經過Connector,Connector會根據請求的協定類型(HTTP、HTTPS等)和端口号,将請求交給對應的Service對象處理。

Service對象中包含了多個Engine對象,每個Engine對象代表一個虛拟主機。當Service接收到一個請求時,它會将請求交給對應的Engine處理。

每個Engine對象又包含了多個Host對象,每個Host對象代表一個虛拟主機中的一個網站。當Engine接收到一個請求時,它會将請求交給對應的Host處理。

最終,每個Host對象會将請求交給一個或多個Context對象處理。Context對象代表一個Web應用程式,當它接收到一個請求時,會将請求交給對應的Servlet處理。

Servlet是基于Java Servlet規範實作的,它是Web應用程式中的核心元件。當Servlet接收到一個請求時,它會根據請求的URL和參數,調用相應的方法,并生成相應的響應内容。

在SpringBoot中,我們可以通過編寫控制器類和路由方法來實作Servlet的功能。控制器類通過注解标記,将路由方法映射到請求的URL和參數。SpringBoot還提供了一系列的自動配置類,使得我們可以快速建構出一個基于Servlet規範的Web應用程式。

以下是一個簡單的SpringBoot應用程式的示例代碼:

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@RestController
public class MyController {
@RequestMapping("/")
public String index() {
return "Hello, World!";
}
}
}           

在上面的代碼中,@SpringBootApplication注解标記了這是一個SpringBoot應用程式,并提供了一個入口方法main()。@RestController注解标記了這是一個控制器類,@RequestMapping注解映射了路由方法到根路徑“/”。當我們啟動這個應用程式時,通路http://localhost:8080/時,會傳回一個字元串“Hello, World!”。

SpringBoot 内置 Tomcat 啟動過程及原理

總結

SpringBoot内置Tomcat的啟動過程類似于Tomcat的啟動過程,它們都是基于Java Servlet規範實作的。SpringBoot提供了一些特定于Tomcat的配置類,使得我們可以友善地建立和配置Tomcat容器。在SpringBoot中,我們可以通過編寫控制器類和路由方法來實作Servlet的功能,進而建構出一個基于Servlet規範的Web應用程式。