揭秘springboot集成tomcat原理
點(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é)
通過上面分析,大致流程如下
通過自動(dòng)裝配默認(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é)果給瀏覽器渲染
看到這個(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)贊支持下哈?
