先上結論:
Controller是spring 的一個bean,由spring的IOC來管理的一個bean
Servlet是一個接口或者接口的實現(常見的是GenericServlet 和 HttpServlet)
HttpServlet做的事情:
首先,有一個映射關系servlet-mapping,url的endpoint 對應的具體的servlet, 比如規定'/lalala' 映射到KevinServlet(繼承自HttpServlet,重寫doGet,doPost等方法)
傳送門(https://blog.csdn.net/zj12352123/article/details/80576748),映射規則的定義,如果是老的Spring項目的話是寫在web.xml
那你在瀏覽器地址欄輸入localhost:8088/lalala , 這個請求就會執行到KevinServlet的doGet方法,經過一系列邏輯,最終將要返回給瀏覽器的數據寫入HttpServletResponse,這樣瀏覽器就能收到結果。
而Controller,只是一個bean,方法上可以加上注解GetMapping,PostMapping等,標注映射的url的endpoint
那請求是怎么到達Controller的具體某個方法的呢
Servlet容器(Tomcat等)接收到請求以后,將請求交給DispatcherServlet的service方法來處理,servlet會在doDispatch里面先找到mappedHandler ,然后找到HandlerAdapter
mappedHandler = this.getHandler(processedRequest);
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
調用HandlerAdapter 的handle方法,其實應該是AbstractHandlerMethodAdapter,
然后調用到RequestMappingHandlerAdapter的handleInternal,最終調用到invokeAndHandle,反射調用controller的方法
具體的時序圖
https://blog.csdn.net/caoyuanyenang/article/details/114401414
找到endpoint對應的bean的方法,並調用。
容器==》DispatcherServlet (service方法) ==》 doDispatcher ==》HandlerAdapter (handle)=》AbstractHandlerMethodAdapter==》RequestMappingHandlerAdapter
==》invokeAndHandle==》反射具體的controller方法
handlerMappings 代碼中所有的controller的帶MappingRequest注解的方法
HandlerExecutionChain getHandler 根據請求中的endpoint,匹配到controller的帶MappingRequest注解的方法