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

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/

标签:调用,Http,SpringBoot,service,startInternal,start,init,Call,方法
来源: https://www.cnblogs.com/jovic/p/14617782.html