阿古达芝麻开门 - 博客园

SpringBoot中一个Http Call怎么到达数据库的

通过前面的章节我们知道Springboot会调用ServletWebServerApplicationContext#getWebServer方法启动tomcat

图片

最终会调用TomcatWebServer#initialize这个方法,然后再调用tomcat#start方法,然后调用LifecycleBase#start:

图片

图片

图片

LifecycleBase#start方法中,有两个比较重要的方法init()和startInternal(),我们首先看LifecycleBase#init()方法:

图片

LifecycleBase#init()的实现比较多,我们重点关心Connector#startInternal,在这个方法里会调用protocolHandler.init(),实际上会调用到AbstractProtocol#init,这个方法中endpoint.init()调用了AbstractEndpoint#init, 这个方法会调用NioEndpoint#bind来初始化socket和绑定端口:

图片

 

其次我们再看LifecycleBase#start方法中的startInternal(),同样这个startInternal的实现方法也很多,我们重点关注Connector#startInternal

图片

这个方法中会调用protocolHandler.start(),实际上调用的是AbstractProtocol#start方法,这个方法里面会调用endpoint.start()会进入AbstractEndpoint#start方法:

图片

然后进入到NioEndpoint#startInternal,在NioEndpoint#startInternal的方法里会启动一堆Poller线程监听NIO的请求:

图片

下面是Poller的run方法,接收到请求后调用processKey(sk, attachment)进行处理:

图片

 

-------------------------漂亮的分割线--------------------------

 

上面提到用processKey(sk, attachment)进行请求的处理,接下来看看一个请求到这里是如何被处理的。

图片

图片

在processSocket方法里面,会利用线程池把请求交给SocketProcessorBase这个线程处理

图片

所以接下来看SocketProcessorBase的run方法中调用了doRun会进入到NioEndpoint#doRun:

图片

接着依次调用AbstractProtocol#process,AbstractProcessorLight#process,Http11Processor#service,CoyoteAdapter#service,在这个方法里,把req 和res转换成了ServletRequest和ServletResponse(适配模式):

图片

在这个service方法了调用connector.getService().getContainer().getPipeline().getFirst().invoke( request, response),进入tomcat内部的很多filter等类(责任链模式),最终到达ApplicationFilterChain#internalDoFilter,在这里会调用DispatcherServlet#service(疑问:怎么找到到DispatcherServlet的?):

图片

然后会经过HttpServlet#service,FrameworkServlet#service,最终到达了DispatcherServlet#doService

图片

 

------------漂亮的分割线----------------

 

请求终于到达Spring的体系,接下来主要看DispatcherServlet#doService,这个方法会调用doDispatch(request, response),然后经过AbstractHandlerMethodAdapter#handle,RequestMappingHandlerAdapter#handleInternal:

图片

最终在InvocableHandlerMethod#doInvoke通过反射调用到对应的Controller的方法:

图片

图片

最后进入到对应的Service:

图片

然后调用mapper的代理进入MapperProxy#invoke,然后进入MapperMethod#execute方法会判断是新增修改还是查询,然后进入到SqlSessionTemplate#selectList,DefaultSqlSession#selectList,CachingExecutor#query,BaseExecutor#query,SimpleExecutor#doQuery,PreparedStatementHandler#query:

图片

PreparedStatement#execute最终执行sql:

图片

 更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/

posted @   阿古达芝麻开门  阅读(134)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示