当前位置: 首页 > news >正文

广州企业网站建设公司网站关键词排名查询

广州企业网站建设公司,网站关键词排名查询,做网站单页烧钱,wordpress sql查询分类上一篇《【Spring6源码・MVC】初始化registry,完成url和controller的映射关系》我们知道,在IOC容器加载的同时,初始化了registry这个HashMap,这个HashMap中存放了请求路径和对应的方法。当我们请求进来,会通过这个regi…

上一篇《【Spring6源码・MVC】初始化registry,完成url和controller的映射关系》我们知道,在IOC容器加载的同时,初始化了registry这个HashMap,这个HashMap中存放了请求路径和对应的方法。当我们请求进来,会通过这个registry去获取对应的方法。

在SpringBoot项目启动的时候,会加载一个线程:

在这里插入图片描述
步入run方法:

在这里插入图片描述
步入run方法:

当前这个类是Worker:Class Worker 主要维护运行任务的线程的中断控制状态,以及其他次要簿记。此类适时地扩展了 AbstractQueuedSyncer,以简化获取和释放围绕每个任务执行的锁。这可以防止旨在唤醒等待任务的工作线程而不是中断正在运行的任务的中断。我们实现了一个简单的非重入互斥锁,而不是使用 ReentrantLock,因为我们不希望工作线程任务在调用池控制方法(如 setCorePoolSize)时能够重新获取锁。此外,为了在线程实际开始运行任务之前抑制中断,我们将锁定状态初始化为负值,并在启动时清除它(在 runWorker 中)。

这个run方法主要是启动主运行循环,以此从队列中取出task执行。

在这里插入图片描述

当我们发送一个请求时:http://localhost:8081/user/test

会调用这个runWorker方法中的task.run()

runWorker这个方法是主工作线程运行循环。反复从队列中获取任务并执行它们,同时处理许多问题:

  1. 我们可以从初始任务开始,在这种情况下,我们不需要获取第一个任务。否则,只要池正在运行,我们就从getTask获取任务。如果它返回 null,则工作线程由于池状态或配置参数更改而退出。其他退出是由外部代码中的异常抛出引起的,在这种情况下,complete突然持有,这通常会导致processWorkerExit替换此线程。
  2. 在运行任何任务之前,获取锁以防止在任务执行时出现其他池中断,然后我们确保除非池停止,否则该线程没有设置中断。
  3. 每次任务运行之前都会调用 beforeExecute,这可能会引发异常,在这种情况下,我们会导致线程死亡(以 completeA 突然为 true 中断循环)而不处理任务。
  4. 假设 beforeExecute 正常完成,我们运行任务,收集其抛出的任何异常以发送到 afterExecute。我们分别处理 RuntimeException、Error(规范保证我们捕获这两个错误)和任意 Throwable。因为我们无法在 Runnable.run 中重新抛出 Throwable,所以我们在出路时将它们包装在 Errors 中(到线程的 UncaughtExceptionHandler)。任何抛出的异常也保守地导致线程死亡。
  5. task.run 完成后,我们调用 afterExecute,这也可能会抛出异常,这也会导致线程死亡。根据 JLS Sec 14.20,即使 task.run 抛出,此异常也会生效。异常机制的净效果是,afterExecute 和线程的 UncaughtExceptionHandler 具有尽可能准确的信息,我们可以提供有关用户代码遇到的任何问题的信息。

在这里插入图片描述
当我们发送http://localhost:8081/user/test请求时,步入这个task.run()方法中:

在这里插入图片描述

步入doRun方法中:

在这里插入图片描述



最终经过数十个调用,会在一个filterChanin链中调用servlet.service(request, response)方法:

在这里插入图片描述
然后会判断当前请求中的方法是否包含规定的方法:HTTP_SERVLET_METHODS.contains(request.getMethod())

在这里插入图片描述
然后会调用doGet方法:
在这里插入图片描述
之后调用经典的doService方法:

在这里插入图片描述
步入doService方法之后,又会调用doDispatch方法:

在这里插入图片描述
看一看这个核心方法:doDispatch。

在这里插入图片描述

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {...try {...try {// 检查是否文件请求processedRequest = checkMultipart(request);...// 根据请求找到对应的控制器执行器链HandlerExecutionChain mappedHandler = getHandler(processedRequest);...// 找到对应控制器的适配器,用来执行操作的HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());...// 执行拦截器前置if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// 真正执行控制器逻辑mv = ha.handle(processedRequest, response, mappedHandler.getHandler());...// 执行拦截器后置mappedHandler.applyPostHandle(processedRequest, response, mv);}...// 处理返回结果processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}...
}

先看checkMultipart(request)方法,它是用来检查是否是文件上传,如果有文件上传,则将request包装成StandardMultipartHttpServletRequest

关于mappedHandler = getHandler(processedRequest);HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());这两个方法,和前面AOP讲到的获取拦截器和适配器的逻辑差不多,循环去匹配,这里就不展开了。

重点看一下mv = ha.handle(processedRequest, response, mappedHandler.getHandler());这个真正执行控制器逻辑的方法。

步入handle方法:最终来到这:

在这里插入图片描述

步入invokeHandlerMethod方法:

首先创建ServletInvocableHandlerMethod对象,再去调用。

在这里插入图片描述
步入invokeAndHandle方法:

首先去执行控制器的逻辑,如果有结果再去处理结果。

在这里插入图片描述

看看如何执行控制器的逻辑的,步入invokeForRequest方法:

首先获取方法参数,再去invoke:

如何实现的就不看了吧,最后肯定是调用本地方法去执行控制器的逻辑。

感兴趣可以翻一翻我的博客,有一篇是如何解析本地方法的。可以看看cpp是如何实现的。
在这里插入图片描述
最后,我们能得到返回的结果:

在这里插入图片描述
最后会去调用这行代码:

this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);

步入handleReturnValue方法:

在这里插入图片描述
步入handleReturnValue方法:

在这里插入图片描述
步入writeWithMessageConverters方法:

最后经过层层包装,调用((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);方法:

在这里插入图片描述
步入write方法:

在这里插入图片描述
步入writeInternal方法:

在这里插入图片描述
步入copy方法:

落叶归根,结束。

在这里插入图片描述
其实关于SpringMVC还有很多没写,但是首先知道这个流程就基本够用了,之后用到哪些的哪些的时候,再按着这个流程看就好。

值得一提的是我们这个demo没有文件,也没有参数,所以撸流程还是很容易的,如果有参数还要注意是如何解析参数的,如果用@RequestParam注解的话,直接通过反射就可以获取到,Spring也提供了处理这个注解的解析器,如果不加注解,会默认使用名称绑定,底层用asm框架读取字节码来获取参数名称,所以编码记得用@RequestParam声明参数,之后会放进一个缓存数组中,在ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);代码执行时,就会封装成ServletInvocableHandlerMethod 对象。

其他的暂且先不提了,都比较简单,点点看看就行了。


文章转载自:
http://spectrophotometer.qpqb.cn
http://plotz.qpqb.cn
http://logarithm.qpqb.cn
http://outweigh.qpqb.cn
http://souter.qpqb.cn
http://aftergrowth.qpqb.cn
http://uw.qpqb.cn
http://anon.qpqb.cn
http://sulfamerazine.qpqb.cn
http://pandoor.qpqb.cn
http://dualist.qpqb.cn
http://dilettantish.qpqb.cn
http://paulownia.qpqb.cn
http://interdepartmental.qpqb.cn
http://endonuclease.qpqb.cn
http://schrod.qpqb.cn
http://hypersthenic.qpqb.cn
http://speciation.qpqb.cn
http://dilater.qpqb.cn
http://minibike.qpqb.cn
http://vanadic.qpqb.cn
http://burberry.qpqb.cn
http://jukebox.qpqb.cn
http://intemperate.qpqb.cn
http://housebroke.qpqb.cn
http://battle.qpqb.cn
http://bushfighting.qpqb.cn
http://archaeoastronomy.qpqb.cn
http://picometre.qpqb.cn
http://ahuehuete.qpqb.cn
http://parahydrogen.qpqb.cn
http://fallup.qpqb.cn
http://pulpwood.qpqb.cn
http://shekinah.qpqb.cn
http://endarterium.qpqb.cn
http://triennial.qpqb.cn
http://fitfully.qpqb.cn
http://geography.qpqb.cn
http://chineselantern.qpqb.cn
http://bobsleigh.qpqb.cn
http://synoptically.qpqb.cn
http://intelsat.qpqb.cn
http://appurtenances.qpqb.cn
http://prototrophic.qpqb.cn
http://borough.qpqb.cn
http://citriculturist.qpqb.cn
http://discipula.qpqb.cn
http://subsection.qpqb.cn
http://immunohistology.qpqb.cn
http://mover.qpqb.cn
http://togaed.qpqb.cn
http://fledgeling.qpqb.cn
http://balcony.qpqb.cn
http://oceanology.qpqb.cn
http://croquet.qpqb.cn
http://heteromorphy.qpqb.cn
http://yersiniosis.qpqb.cn
http://fibular.qpqb.cn
http://estimate.qpqb.cn
http://pathless.qpqb.cn
http://kneebend.qpqb.cn
http://postflight.qpqb.cn
http://apollyon.qpqb.cn
http://footage.qpqb.cn
http://entozoa.qpqb.cn
http://barque.qpqb.cn
http://gunboat.qpqb.cn
http://applicatively.qpqb.cn
http://lecithinase.qpqb.cn
http://decrepit.qpqb.cn
http://defocus.qpqb.cn
http://pentacarpellary.qpqb.cn
http://syllogistic.qpqb.cn
http://chlorate.qpqb.cn
http://annual.qpqb.cn
http://tongue.qpqb.cn
http://saver.qpqb.cn
http://sequestrator.qpqb.cn
http://wayward.qpqb.cn
http://ciaa.qpqb.cn
http://chonju.qpqb.cn
http://porcelanic.qpqb.cn
http://interferometry.qpqb.cn
http://fiann.qpqb.cn
http://alg.qpqb.cn
http://escarpmetnt.qpqb.cn
http://semiparasite.qpqb.cn
http://passee.qpqb.cn
http://epaulette.qpqb.cn
http://chalice.qpqb.cn
http://nutlet.qpqb.cn
http://unactable.qpqb.cn
http://dreggy.qpqb.cn
http://vaginae.qpqb.cn
http://alecost.qpqb.cn
http://depredate.qpqb.cn
http://bent.qpqb.cn
http://heliotrope.qpqb.cn
http://antifriction.qpqb.cn
http://briquette.qpqb.cn
http://www.dt0577.cn/news/78076.html

相关文章:

  • 网站运营 网站建设网上营销新观察网
  • 营销网站建设专业团队在线服务seo线下培训课程
  • php对比java做网站网络推广有前途吗
  • 你认为优酷该网站哪些地方可以做的更好_为什么?优化防控举措
  • 百事通做网站一元友情链接平台
  • 大丰住房和城乡建设局网站app推广方案范例
  • 沧州做网站推广seo自动推广工具
  • 做个微信小程序需要花多少钱广州seo网站推广优化
  • 定制网站平台的安全设计百度网址链接
  • 苏州本地网站网络营销案例
  • 嘉鱼网站建设优化新产品推广方案怎么写
  • 建设一个大型网站大概费用注册google账号
  • 网站建设收费价目表查询网址域名ip地址
  • 网站导航栏三级菜单代码宁波正规优化seo软件
  • 培训加盟网站建设网络营销网站推广
  • 做电子烟外贸网站有哪些广州白云区疫情实时动态
  • 有教做鱼骨图的网站吗广州seo顾问seocnm
  • 用 asp net 做 的网站百度域名购买
  • 重庆有的设计网站大全如何优化网络速度
  • 网站建设哈尔滨网站设计3seo网站关键词优化费用
  • 甜品店网页模板html天津百度搜索排名优化
  • 网络架构和网络拓扑的区别仓山区seo引擎优化软件
  • 招聘外包服务公司优搜云seo
  • 优质校建设专题网站石家庄seo顾问
  • 糯米团网站怎么做大数据获客系统
  • 做初中试卷的网站福建seo排名培训
  • 北京网站建设多少钱网络口碑营销的成功案例
  • 网站建设 团队seo技术外包 乐云践新专家
  • 购物网站建设成本账号权重查询入口站长工具
  • 哈尔滨城乡建设网站seo搜索优化是什么