<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          揭秘springboot集成tomcat原理

          共 2825字,需瀏覽 6分鐘

           ·

          2021-01-06 15:07

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          66套java從入門到精通實(shí)戰(zhàn)課程分享

          前言

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

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

          • web容器:用來與我們的瀏覽器做交互,即與http請求做交互

          • servlet容器:與http請求做交互的時(shí)候,如何調(diào)用我們的業(yè)務(wù)代碼呢?這個(gè)時(shí)候就需要我們的servlet規(guī)范了,各個(gè)web容器廠商只要實(shí)現(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();
          }

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

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

          傳統(tǒng)項(xiàng)目

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

          dispatcherServlet
          ??org.springframework.web.servlet.DispatcherServlet
          ??
          ????contextConfigLocation
          ????classpath:spring-mvc.xml
          ??

          ??1


          ??dispatcherServlet
          ??/


          DispatcherServlet

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

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


          在DispatcherServletAutoConfiguration里面有這么一個(gè)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)建了一個(gè)DispatcherServlet來處理http請求

          總結(jié)

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

          1. 通過自動(dòng)裝配默認(rèn)加載了DispatcherServlet,所有請求都會轉(zhuǎn)發(fā)到DispatcherServlet

          2. DispatcherServlet的doService方法中拿到HttpServletRequest和HttpServletResponse對象
            從HttpServletRequest可以拿到我們的http頭、url請求等信息

          3. 根據(jù)獲取的信息,從ioc容器中找到對應(yīng)的Controller對應(yīng)的action,進(jìn)行反射調(diào)用

          4. 根據(jù)HttpServletResponse返回調(diào)用結(jié)果給瀏覽器渲染

          看到這個(gè)流程,相信大家對應(yīng)tomcat處理http請求的流程就會有一個(gè)清晰的了解了,而springboot中的內(nèi)置tomcat,基本組件都是參考自原生Tomcat的,即使我們自己寫一個(gè)簡易的tomcat來處理請求也不是什么難事。

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



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/qq_31086797/article/details/111876084





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ???

          ?長按上方微信二維碼?2 秒


          感謝點(diǎn)贊支持下哈?

          瀏覽 94
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品国产91乱码一区二区三区 | 亚洲无 码A片在线 | 日韩国产免费 | 国产精品扒开腿做爽爽爽网站免费 | 日日综合网 |