时间:2021-07-01 10:21:17 帮助过:30人阅读
通过前面的章节我们知道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