码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2021-04-06 15:11:52      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:getc   proc   初始化   socket   int   text   poll   bsd   AMM   

通过前面的章节我们知道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/

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

标签:getc   proc   初始化   socket   int   text   poll   bsd   AMM   

原文地址:https://www.cnblogs.com/jovic/p/14617782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!