日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot中SpringMVC 整合启动嵌入式Tomcat 原理及源码解析

發布時間:2023/12/10 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot中SpringMVC 整合启动嵌入式Tomcat 原理及源码解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SpringBoot 是微服務模式下 Spring的最佳實踐方式,它整合了web 服務器,可以通過 Main 方法直接啟動微服務。

SpringBoot 整合Tomcat原理:

1、Tomcat 是 JAVA 語言開發的應用程序 ,打包成應用程序它的啟動入口是:BootStrap

eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \-classpath "\"$CLASSPATH\"" \-Dcatalina.base="\"$CATALINA_BASE\"" \-Dcatalina.home="\"$CATALINA_HOME\"" \-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \org.apache.catalina.startup.Bootstrap "$@" start

2、我們同樣可以在 Java 代碼中直接調用Tomcat 的 Start 方法來啟動Tomcat,但是注意 啟動之前要先配置Tomcat。Tomcat類和Bootstrap類的區別是:Tomcat類是作為嵌入式模式下最小配置啟動入口,而Bootstrap是Tomcat作用獨立應用時候的啟動入口。

public static void run() {System.out.println("app start...");Tomcat tomcat = new Tomcat();tomcat.setPort(8086);try {tomcat.addWebapp("/", "d:\\tom\\");tomcat.start();tomcat.getServer().await();} catch (LifecycleException | ServletException e) {e.printStackTrace();}}

3、既然 Tomcat 是Servlet 服務器,那么我們代碼中在啟動Tomcat 之前將SpringMVC的 DispatcherServlet 配置好 交給 Tomcat 是不是就可以實現啟動Web服務? 答案是肯定的。

PS:實現了ServletContainerInitializer 接口的具體類的onStartup函數會在Servlet 容器啟動時自動被調用,從而實現了在方法內注冊spring ioc容器以及DispatcherServlet。 ? ??Servlet 3.0 新增的一個ServletContainerInitializer接口,WEB容器在啟動時使用 JAR 服務 API(JAR Service API) 來發現 ServletContainerInitializer 的實現類的servlet配置,而WebApplicationInitializer是一個被委托接口。

源碼:

//------------Spring 配置類--------------// @Configuration @ComponentScan("com.src") public class AppConfig { }//-------------Servlet 3.0 -------------// public class MyWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {System.out.println("====web init===");AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();ac.register(AppConfig.class);DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);ServletRegistration.Dynamic registration = servletContext.addServlet("mvc", dispatcherServlet);registration.setLoadOnStartup(1);registration.addMapping("/*");} }//-------------TomcatRunner -------------// public class TomcatRunner {public static void run() {System.out.println("app start...");Tomcat tomcat = new Tomcat();tomcat.setPort(8086);try {tomcat.addWebapp("/", "d:\\tom\\");tomcat.start();tomcat.getServer().await();} catch (LifecycleException | ServletException e) {e.printStackTrace();}} }//-------------ApplicationStarter -------------// public class ApplicationStarter {public static void main(String[] args) {TomcatRunner.run();} }//-------------RestController-------------// @RestController @RequestMapping("/hello") public class HelloController {@GetMapping("/hi")public String hello() {return "ok";} }

SpringBoot 整合Tomcat 領域模型設計(類圖):

SpringBoot 整合Tomcat 源碼解析:

@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {DispatcherServlet dispatcherServlet = new DispatcherServlet();dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());return dispatcherServlet;} @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,webMvcProperties.getServlet().getPath());registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());multipartConfig.ifAvailable(registration::setMultipartConfig);return registration;}org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefreshprotected void onRefresh() {super.onRefresh();try {// 從此處開始啟動web服務器.this.createWebServer();} catch (Throwable var2) {throw new ApplicationContextException("Unable to start web server", var2);}}

SpringBoot 啟動Tomcat 方法調用鏈:

start:486, Tomcat (org.apache.catalina.startup) initialize:123, TomcatWebServer (org.springframework.boot.web.embedded.tomcat) <init>:104, TomcatWebServer (org.springframework.boot.web.embedded.tomcat) getTomcatWebServer:437, TomcatServletWebServerFactory (org.springframework.boot.web.embedded.tomcat) getWebServer:191, TomcatServletWebServerFactory (org.springframework.boot.web.embedded.tomcat) createWebServer:178, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context) onRefresh:158, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context) refresh:545, AbstractApplicationContext (org.springframework.context.support) refresh:143, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context) refresh:758, SpringApplication (org.springframework.boot) refresh:750, SpringApplication (org.springframework.boot) refreshContext:397, SpringApplication (org.springframework.boot) run:315, SpringApplication (org.springframework.boot) run:1237, SpringApplication (org.springframework.boot) run:1226, SpringApplication (org.springframework.boot)

${紙上得來終覺淺!}

總結

以上是生活随笔為你收集整理的SpringBoot中SpringMVC 整合启动嵌入式Tomcat 原理及源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。