javascript
很简单的源码剖析-SpringBoot内嵌Tomcat原理
Spring Boot默認支持Tomcat,Jetty,和Undertow作為底層容器。而Spring Boot默認使用Tomcat,一旦引入spring-boot-starter-web模塊,就默認使用Tomcat容器。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>在啟動springboot的時候可謂是相當簡單,只需要執行以下代碼:
@SpringBootApplication public class SpringBootMyTestApplication {public static void main(String[] args) {SpringApplication.run(SpringBootMyTestApplication.class, args);} }那些看似簡單的事物,其實并不簡單。我們之所以覺得他簡單,是因為復雜性都被隱藏了。通過上訴代碼,大概率可以提出以下幾個疑問
這次的重點是先分享SpringBoot是如何啟動內置的Tomcat的
1.內嵌Tomcat自動配置原理
1.1 Tomcat服務自動配置類
在SpringBoot的啟動過程中會自動加載各個模塊下的META-INF/spring.factories文件中定義的自動配置類,Tomcat的服務的加載也是如此,所以首先要找到加載的自動配置,如下圖所示:
找到這個配置類進去看一下實現的內容:
可以看到里面也通過@Import注解將EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow等嵌入式容器類加載進來了,springboot默認是啟動嵌入式tomcat容器,如果要改變啟動jetty或者undertow容器,需在pom文件中去設置。
這里默認實現的是Tomcat容器,那么看一下EmbeddedTomcat:
進入TomcatServletWebServerFactory類,里面的getWebServer()是關鍵方法,如圖:
繼續進入getTomcatWebServer()等方法,一直往下跟到tomcat初始化方法,調用tomcat.start()方法,tomcat就正式開啟運行,見圖:
走到這里tomcat在springboot中的配置以及最終啟動的流程就走完了。
1.2 SpringBoot啟動Tomcat
在SpringBoot啟動過程中有一個很重要的步驟:
// 刷新應用上下文 refreshContext(context);內置tomcat的啟動就是在這個方法中進行調用的,點擊實現的邏輯,最終進到了Spring的源碼中:
上面的這個onRefresh()方法就是關鍵點,點擊進行查看源碼,onRefresh()會調用到ServletWebServerApplicationContext中的createWebServer(),
createWebServer()就是啟動web服務,但是還沒有真正啟動Tomcat,既然webServer是通過ServletWebServerFactory來獲取的,先來看一下getWebServerFactory()方法的實現:
protected ServletWebServerFactory getWebServerFactory() {// Use bean names so that we don't consider the hierarchyString[] 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); }看最后一步的返回,因為這里使用的是tomcat容器,所以最終返回的就是一個TomcatServletWebServerFactory實例,最終就調用了TomcatServletWebServerFactory類的getWebServer()方法,那么也就實現了tomcat服務的啟動。
debug驗證一下上述的流程:
2.小結
附上源碼流程圖:
總結
以上是生活随笔為你收集整理的很简单的源码剖析-SpringBoot内嵌Tomcat原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GMT与UTC简介
- 下一篇: SpringBoot内嵌Tomcat原理