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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

揭秘springboot集成tomcat原理

發(fā)布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 揭秘springboot集成tomcat原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

曾幾何時,我們使用springboot后使用內(nèi)置的tomcat項目進(jìn)行啟動項目,但是這里是如何集成的可能我們并不清楚,本文發(fā)表一些筆者的理解和看法

在這里先拋出一些原生Tomcat作為web服務(wù)器的知識,Tomcat稱之為web容器,也可以稱之為servlet容器,原因如下:

  • web容器:用來與我們的瀏覽器做交互,即與http請求做交互
  • servlet容器:與http請求做交互的時候,如何調(diào)用我們的業(yè)務(wù)代碼呢?這個時候就需要我們的servlet規(guī)范了,各個web容器廠商只要實現(xiàn)servlet規(guī)范,即可制作自己的web容器了。而我們的業(yè)務(wù)代碼也可以基于servlet規(guī)范下進(jìn)行我們的業(yè)務(wù)代碼調(diào)用了。

servlet規(guī)范也就是我們常見的servlet-api.jar中定義的規(guī)范了,在原生tomcat里面也是默認(rèn)加載了該jar包。

springboot

在我們的springboot中使用了內(nèi)置的tomcat,servlet規(guī)范也使用了自己的類,主要類即ervlet.java類,代碼如下:

public interface Servlet {public void init(ServletConfig config) throws ServletException;public ServletConfig getServletConfig();public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;public String getServletInfo();public void destroy(); }

主要也就是以上幾個方法,最關(guān)鍵的即是service方法來處理我們的業(yè)務(wù)代碼,這個類在servlet-api中也是這么定義的。

這就是我們的Servlet規(guī)范了

傳統(tǒng)項目

在我們以前使用springmvc的項目中都會在web.xml中配置DispatcherServlet,也就是把我們?nèi)我獾恼埱笕哭D(zhuǎn)發(fā)給DispatcherServlet的service

<servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern> </servlet-mapping>

DispatcherServlet

DispatcherServlet間接的實現(xiàn)了Servlet接口,實現(xiàn)了servlet規(guī)范,也就是我們只要在配置文件中定義DispatcherServlet,那么所有請求都可以轉(zhuǎn)發(fā)到DispatcherServlet中

在springboot中我們不在配置DispatcherServlet了,而是又springboot的自動裝配來默認(rèn)裝載,自動裝配的原理在此不做介紹,簡單的說就是默認(rèn)加載META-INF/spring.factories定義的類,然后我們就可以在spring.factories中找到我們的關(guān)鍵類DispatcherServletAutoConfiguration


在DispatcherServletAutoConfiguration里面有這么一個bean

@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)public DispatcherServlet dispatcherServlet() {DispatcherServlet dispatcherServlet = new DispatcherServlet();dispatcherServlet.setDispatchOptionsRequest(this.webMvcProperties.isDispatchOptionsRequest());dispatcherServlet.setDispatchTraceRequest(this.webMvcProperties.isDispatchTraceRequest());dispatcherServlet.setThrowExceptionIfNoHandlerFound(this.webMvcProperties.isThrowExceptionIfNoHandlerFound());dispatcherServlet.setEnableLoggingRequestDetails(this.httpProperties.isLogRequestDetails());return dispatcherServlet;}

這里也就可以看出來springboot默認(rèn)創(chuàng)建了一個DispatcherServlet來處理http請求

總結(jié)

通過上面分析,大致流程如下

  • 通過自動裝配默認(rèn)加載了DispatcherServlet,所有請求都會轉(zhuǎn)發(fā)到DispatcherServlet
  • DispatcherServlet的doService方法中拿到HttpServletRequest和HttpServletResponse對象
    從HttpServletRequest可以拿到我們的http頭、url請求等信息
  • 根據(jù)獲取的信息,從ioc容器中找到對應(yīng)的Controller對應(yīng)的action,進(jìn)行反射調(diào)用
  • 根據(jù)HttpServletResponse返回調(diào)用結(jié)果給瀏覽器渲染
  • 看到這個流程,相信大家對應(yīng)tomcat處理http請求的流程就會有一個清晰的了解了,而springboot中的內(nèi)置tomcat,基本組件都是參考自原生Tomcat的,即使我們自己寫一個簡易的tomcat來處理請求也不是什么難事。

    以上就是筆者對springboot中tomcat處理的一些見解!

    總結(jié)

    以上是生活随笔為你收集整理的揭秘springboot集成tomcat原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。