@ -15,13 +15,13 @@
< span class = "token class-name" > Cookie< / span > cookie < span class = "token operator" > =< / span > < span class = "token keyword" > new< / span > < span class = "token class-name" > Cookie< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > "a"< / span > < span class = "token punctuation" > ,< / span > < span class = "token string" > "b"< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
response< span class = "token punctuation" > .< / span > < span class = "token function" > addCookie< / span > < span class = "token punctuation" > (< / span > cookie< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
response< span class = "token punctuation" > .< / span > < span class = "token function" > setStatus< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletResponse< / span > < span class = "token punctuation" > .< / span > < span class = "token constant" > SC_OK< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 这样的设置就能成功设定 cookie,而随着目前的浏览器 cookie 策略,如果要跳转后设置的话,估计是会越来越难,包括< pre class = "line-numbers language-java" data-language = java > < code class = language-java > response< span class = "token punctuation" > .< / span > < span class = "token function" > addHeader< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > "Set-Cookie"< / span > < span class = "token punctuation" > ,< / span > < span class = "token string" > "a=b; domain=baidu.com; SameSite=none;Secure"< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < / span > < / code > < / pre > < p > 这样的方式也没法实现。< / div > < footer class = post-footer > < div class = post-eof > < / div > < / footer > < / article > < / div > < div class = post-block > < article class = post-content itemscope itemtype = http://schema.org/Article > < link href = https://nicksxs.me/2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ itemprop = mainEntityOfPage > < span hidden itemprop = author itemscope itemtype = http://schema.org/Person > < meta content = /uploads/avatar.jpg itemprop = image > < meta content = Nicksxs itemprop = name > < / span > < span hidden itemprop = publisher itemscope itemtype = http://schema.org/Organization > < meta content = "Nicksxs's Blog" itemprop = name > < meta content = "learn from zero,技术博客,Nicksxs,史学森" itemprop = description > < / span > < span hidden itemprop = post itemscope itemtype = http://schema.org/CreativeWork > < meta content = "undefined | Nicksxs's Blog" itemprop = name > < meta itemprop = description > < / span > < header class = post-header > < h2 itemprop = "name headline" class = post-title > < a class = post-title-link href = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ itemprop = url > springboot 请求响应处理流程< / a > < / h2 > < div class = post-meta-container > < div class = post-meta > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar" > < / i > < / span > < span class = post-meta-item-text > 发表于< / span > < time itemprop = "dateCreated datePublished" title = "创建时间:2023-08-27 22:47:19" datetime = 2023-08-27T22:47:19+08:00 > 2023-08-27< / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-folder" > < / i > < / span > < span class = post-meta-item-text > 分类于< / span > < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/ itemprop = url rel = index > < span itemprop = name > Java< / span > < / a > < / span > , < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/SpringBoot/ itemprop = url rel = index > < span itemprop = name > SpringBoot< / span > < / a > < / span > < / span > < span class = "post-meta-item leancloud_visitors" data-flag-title = "springboot 请求响应处理流程" id = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ title = 阅读次数 > < span class = post-meta-item-icon > < i class = "far fa-eye" > < / i > < / span > < span class = post-meta-item-text > 阅读次数:< / span > < span class = leancloud-visitors-count > < / span > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-comment" > < / i > < / span > < span class = post-meta-item-text > Disqus:< / span > < a href = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/#disqus_thread itemprop = discussionUrl title = disqus > < span class = "post-comments-count disqus-comment-count" data-disqus-identifier = 2023/08/27/springboot-请求响应处理流程/ itemprop = commentCount > < / span > < / a > < / span > < / div > < / div > < / header > < div class = post-body itemprop = articleBody > < p > Tomcat 会把请求委托到< code > org.springframework.web.servlet.DispatcherServlet#doService< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token keyword" > void< / span > < span class = "token function" > doService< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 这样的设置就能成功设定 cookie,而随着目前的浏览器 cookie 策略,如果要跳转后设置的话,估计是会越来越难,包括< pre class = "line-numbers language-java" data-language = java > < code class = language-java > response< span class = "token punctuation" > .< / span > < span class = "token function" > addHeader< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > "Set-Cookie"< / span > < span class = "token punctuation" > ,< / span > < span class = "token string" > "a=b; domain=baidu.com; SameSite=none;Secure"< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < / span > < / code > < / pre > < p > 这样的方式也没法实现。< / div > < footer class = post-footer > < div class = post-eof > < / div > < / footer > < / article > < / div > < div class = post-block > < article class = post-content itemscope itemtype = http://schema.org/Article > < link href = https://nicksxs.me/2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ itemprop = mainEntityOfPage > < span hidden itemprop = author itemscope itemtype = http://schema.org/Person > < meta content = /uploads/avatar.jpg itemprop = image > < meta content = Nicksxs itemprop = name > < / span > < span hidden itemprop = publisher itemscope itemtype = http://schema.org/Organization > < meta content = "Nicksxs's Blog" itemprop = name > < meta content = "learn from zero,技术博客,Nicksxs,史学森" itemprop = description > < / span > < span hidden itemprop = post itemscope itemtype = http://schema.org/CreativeWork > < meta content = "undefined | Nicksxs's Blog" itemprop = name > < meta itemprop = description > < / span > < header class = post-header > < h2 itemprop = "name headline" class = post-title > < a class = post-title-link href = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ itemprop = url > springboot 请求响应处理流程< / a > < / h2 > < div class = post-meta-container > < div class = post-meta > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar" > < / i > < / span > < span class = post-meta-item-text > 发表于< / span > < time itemprop = "dateCreated datePublished" title = "创建时间:2023-08-27 22:47:19" datetime = 2023-08-27T22:47:19+08:00 > 2023-08-27< / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar-check" > < / i > < / span > < span class = post-meta-item-text > 更新于< / span > < time title = "修改时间:2023-09-05 17:19:33" datetime = 2023-09-05T17:19:33+08:00 itemprop = dateModified > 2023-09-05< / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa- folder" > < / i > < / span > < span class = post-meta-item-text > 分类于< / span > < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/ itemprop = url rel = index > < span itemprop = name > Java< / span > < / a > < / span > , < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/SpringBoot/ itemprop = url rel = index > < span itemprop = name > SpringBoot< / span > < / a > < / span > < / span > < span class = "post-meta-item leancloud_visitors" data-flag-title = "springboot 请求响应处理流程" id = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/ title = 阅读次数 > < span class = post-meta-item-icon > < i class = "far fa-eye" > < / i > < / span > < span class = post-meta-item-text > 阅读次数:< / span > < span class = leancloud-visitors-count > < / span > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-comment" > < / i > < / span > < span class = post-meta-item-text > Disqus:< / span > < a href = /2023/08/27/springboot-%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/#disqus_thread itemprop = discussionUrl title = disqus > < span class = "post-comments-count disqus-comment-count" data-disqus-identifier = 2023/08/27/springboot-请求响应处理流程/ itemprop = commentCount > < / span > < / a > < / span > < / div > < / div > < / header > < div class = post-body itemprop = articleBody > < p > Tomcat 会把请求委托到< br > < code > org.springframework.web.servlet.DispatcherServlet#doService< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token keyword" > void< / span > < span class = "token function" > doService< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token function" > logRequest< / span > < span class = "token punctuation" > (< / span > request< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token comment" > // 省略前面的代码< / span >
< span class = "token keyword" > try< / span > < span class = "token punctuation" > {< / span >
< span class = "token function" > doDispatch< / span > < span class = "token punctuation" > (< / span > request< span class = "token punctuation" > ,< / span > response< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 然后就是调用< code > org.springframework.web.servlet.DispatcherServlet#doDispatch< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token keyword" > void< / span > < span class = "token function" > doDispatch< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 然后就是调用< br > < code > org.springframework.web.servlet.DispatcherServlet#doDispatch< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token keyword" > void< / span > < span class = "token function" > doDispatch< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > try< / span > < span class = "token punctuation" > {< / span >
< span class = "token class-name" > ModelAndView< / span > mv < span class = "token operator" > =< / span > < span class = "token keyword" > null< / span > < span class = "token punctuation" > ;< / span >
@ -69,7 +69,7 @@
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > }< / span >
< span class = "token keyword" > return< / span > < span class = "token keyword" > null< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 可以看到有这些 HandlerMapping< br > < img data-src = https://img.nicksxs.com/blog/xqv27E.png > < br > 而这里面就是前面提到过的< code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping< / code > < br > 从这就能找到具体的 Handler< br > < code > com.nicksxs.spbdemo.controller.DemoController#test()< / code > < br > 这就是我简单的示例代码< pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @RequestMapping< / span > < span class = "token punctuation" > (< / span > value < span class = "token operator" > =< / span > < span class = "token string" > "/test"< / span > < span class = "token punctuation" > ,< / span > method < span class = "token operator" > =< / span > < span class = "token class-name" > RequestMethod< / span > < span class = "token punctuation" > .< / span > < span class = "token constant" > GET< / span > < span class = "token punctuation" > )< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 可以看到有这些 HandlerMapping< br > < img data-src = https://img.nicksxs.com/blog/xqv27E.png > < br > 而这里面就是前面提到过的< br > < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping< / code > < br > 从这就能找到具体的 Handler< br > < code > com.nicksxs.spbdemo.controller.DemoController#test()< / code > < br > 这就是我简单的示例代码< pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @RequestMapping< / span > < span class = "token punctuation" > (< / span > value < span class = "token operator" > =< / span > < span class = "token string" > "/test"< / span > < span class = "token punctuation" > ,< / span > method < span class = "token operator" > =< / span > < span class = "token class-name" > RequestMethod< / span > < span class = "token punctuation" > .< / span > < span class = "token constant" > GET< / span > < span class = "token punctuation" > )< / span >
< span class = "token annotation punctuation" > @ResponseBody< / span >
< span class = "token keyword" > public< / span > < span class = "token class-name" > DemoResponse< / span > < span class = "token function" > test< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token class-name" > String< / span > item < span class = "token operator" > =< / span > < span class = "token string" > "{\"id\": 1, \"name\": \"nick\"}"< / span > < span class = "token punctuation" > ;< / span >
@ -77,7 +77,7 @@
parserConfig< span class = "token punctuation" > .< / span > propertyNamingStrategy < span class = "token operator" > =< / span > < span class = "token class-name" > PropertyNamingStrategy< span class = "token punctuation" > .< / span > SnakeCase< / span > < span class = "token punctuation" > ;< / span >
< span class = "token class-name" > DemoResponse< / span > response < span class = "token operator" > =< / span > < span class = "token constant" > JSON< / span > < span class = "token punctuation" > .< / span > < span class = "token function" > parseObject< / span > < span class = "token punctuation" > (< / span > item< span class = "token punctuation" > ,< / span > < span class = "token class-name" > DemoResponse< / span > < span class = "token punctuation" > .< / span > < span class = "token keyword" > class< / span > < span class = "token punctuation" > ,< / span > parserConfig< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token keyword" > return< / span > response< span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 再获取适配器,< code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > HandlerAdapter< / span > < span class = "token function" > getHandlerAdapter< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > Object< / span > handler< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > ServletException< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 下一步是 再获取处理器的 适配器,< br > < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > HandlerAdapter< / span > < span class = "token function" > getHandlerAdapter< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > Object< / span > handler< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > ServletException< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > if< / span > < span class = "token punctuation" > (< / span > < span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > handlerAdapters < span class = "token operator" > !=< / span > < span class = "token keyword" > null< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > for< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerAdapter< / span > adapter < span class = "token operator" > :< / span > < span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > handlerAdapters< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > if< / span > < span class = "token punctuation" > (< / span > adapter< span class = "token punctuation" > .< / span > < span class = "token function" > supports< / span > < span class = "token punctuation" > (< / span > handler< span class = "token punctuation" > )< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
@ -90,13 +90,13 @@
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 正好这个适配器是调用的父类的 supports 方法< pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Override< / span >
< span class = "token keyword" > public< / span > < span class = "token keyword" > final< / span > < span class = "token keyword" > boolean< / span > < span class = "token function" > supports< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > Object< / span > handler< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > return< / span > < span class = "token punctuation" > (< / span > handler < span class = "token keyword" > instanceof< / span > < span class = "token class-name" > HandlerMethod< / span > < span class = "token operator" > & & < / span > < span class = "token function" > supportsInternal< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > < span class = "token punctuation" > )< / span > handler< span class = "token punctuation" > )< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 而我这个< code > com.nicksxs.spbdemo.controller.DemoController#test()< / code > 就是个包装好的 < code > HandlerMethod< / code > < br > 然后就是调用 < code > ha< / code > 的 < code > handle< / code > 方法,也是通过模板方法,实际调用的是< br > < code > org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#handle< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Override< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 而我这个< code > com.nicksxs.spbdemo.controller.DemoController#test()< / code > < br > 就是个包装好的 < code > HandlerMethod< / code > < br > 然后就是调用 < code > ha< / code > 的 < code > handle< / code > 方法,也是通过模板方法,实际调用的是< br > < code > org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#handle< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Override< / span >
< span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token keyword" > public< / span > < span class = "token keyword" > final< / span > < span class = "token class-name" > ModelAndView< / span > < span class = "token function" > handle< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > ,< / span > < span class = "token class-name" > Object< / span > handler< span class = "token punctuation" > )< / span >
< span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > return< / span > < span class = "token function" > handleInternal< / span > < span class = "token punctuation" > (< / span > request< span class = "token punctuation" > ,< / span > response< span class = "token punctuation" > ,< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > < span class = "token punctuation" > )< / span > handler< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 然后调用 < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Override< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 然后调用< br > < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Override< / span >
< span class = "token keyword" > protected< / span > < span class = "token class-name" > ModelAndView< / span > < span class = "token function" > handleInternal< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span >
< span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
@ -121,7 +121,7 @@
< span class = "token comment" > // 是否要锁定 session,否则走到这< / span >
< span class = "token comment" > // No synchronization on session demanded at all...< / span >
mav < span class = "token operator" > =< / span > < span class = "token function" > invokeHandlerMethod< / span > < span class = "token punctuation" > (< / span > request< span class = "token punctuation" > ,< / span > response< span class = "token punctuation" > ,< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 继续调用< code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 继续调用< br > < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token keyword" > protected< / span > < span class = "token class-name" > ModelAndView< / span > < span class = "token function" > invokeHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HttpServletRequest< / span > request< span class = "token punctuation" > ,< / span >
< span class = "token class-name" > HttpServletResponse< / span > response< span class = "token punctuation" > ,< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
@ -144,13 +144,13 @@
< span class = "token keyword" > finally< / span > < span class = "token punctuation" > {< / span >
webRequest< span class = "token punctuation" > .< / span > < span class = "token function" > requestCompleted< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 稍微在 看一眼< br > 第一步是< code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#createInvocableHandlerMethod< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > ServletInvocableHandlerMethod< / span > < span class = "token function" > createInvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 稍微再 看一眼< br > 第一步是< br > < code > org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#createInvocableHandlerMethod< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > ServletInvocableHandlerMethod< / span > < span class = "token function" > createInvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > return< / span > < span class = "token keyword" > new< / span > < span class = "token class-name" > ServletInvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第二步是< code > org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#ServletInvocableHandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token class-name" > ServletInvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第二步是< br > < code > org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#ServletInvocableHandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token class-name" > ServletInvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > super< / span > < span class = "token punctuation" > (< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第三部是 < code > org.springframework.web.method.support.InvocableHandlerMethod#InvocableHandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token class-name" > InvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第三步是< br > < code > org.springframework.web.method.support.InvocableHandlerMethod#InvocableHandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token class-name" > InvocableHandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > super< / span > < span class = "token punctuation" > (< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第四步是< code > org.springframework.web.method.HandlerMethod#HandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > HandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 第四步是< br > < code > org.springframework.web.method.HandlerMethod#HandlerMethod(org.springframework.web.method.HandlerMethod)< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > protected< / span > < span class = "token class-name" > HandlerMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > HandlerMethod< / span > handlerMethod< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token class-name" > Assert< / span > < span class = "token punctuation" > .< / span > < span class = "token function" > notNull< / span > < span class = "token punctuation" > (< / span > handlerMethod< span class = "token punctuation" > ,< / span > < span class = "token string" > "HandlerMethod is required"< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > bean < span class = "token operator" > =< / span > handlerMethod< span class = "token punctuation" > .< / span > bean< span class = "token punctuation" > ;< / span >
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > beanFactory < span class = "token operator" > =< / span > handlerMethod< span class = "token punctuation" > .< / span > beanFactory< span class = "token punctuation" > ;< / span >
@ -162,13 +162,13 @@
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > responseStatusReason < span class = "token operator" > =< / span > handlerMethod< span class = "token punctuation" > .< / span > responseStatusReason< span class = "token punctuation" > ;< / span >
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > description < span class = "token operator" > =< / span > handlerMethod< span class = "token punctuation" > .< / span > description< span class = "token punctuation" > ;< / span >
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > resolvedFromHandlerMethod < span class = "token operator" > =< / span > handlerMethod< span class = "token punctuation" > .< / span > resolvedFromHandlerMethod< span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 这是个继承关系,一直调用到最顶层的父类的构造方法,其实就是拷贝,然后继续调用< code > org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token keyword" > void< / span > < span class = "token function" > invokeAndHandle< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > ServletWebRequest< / span > webRequest< span class = "token punctuation" > ,< / span > < span class = "token class-name" > ModelAndViewContainer< / span > mavContainer< span class = "token punctuation" > ,< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 这是个继承关系,一直调用到最顶层的父类的构造方法,其实就是拷贝,然后继续调用< br > < code > org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > public< / span > < span class = "token keyword" > void< / span > < span class = "token function" > invokeAndHandle< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > ServletWebRequest< / span > webRequest< span class = "token punctuation" > ,< / span > < span class = "token class-name" > ModelAndViewContainer< / span > mavContainer< span class = "token punctuation" > ,< / span >
< span class = "token class-name" > Object< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > providedArgs< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token comment" > // 调用请求< / span >
< span class = "token class-name" > Object< / span > returnValue < span class = "token operator" > =< / span > < span class = "token function" > invokeForRequest< / span > < span class = "token punctuation" > (< / span > webRequest< span class = "token punctuation" > ,< / span > mavContainer< span class = "token punctuation" > ,< / span > providedArgs< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token comment" > // 稍微忽略下后面的代码< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 继续调用 < code > org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 继续调用< br > < code > org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token keyword" > public< / span > < span class = "token class-name" > Object< / span > < span class = "token function" > invokeForRequest< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > NativeWebRequest< / span > request< span class = "token punctuation" > ,< / span > < span class = "token annotation punctuation" > @Nullable< / span > < span class = "token class-name" > ModelAndViewContainer< / span > mavContainer< span class = "token punctuation" > ,< / span >
< span class = "token class-name" > Object< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > providedArgs< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
@ -177,7 +177,7 @@
logger< span class = "token punctuation" > .< / span > < span class = "token function" > trace< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > "Arguments: "< / span > < span class = "token operator" > +< / span > < span class = "token class-name" > Arrays< / span > < span class = "token punctuation" > .< / span > < span class = "token function" > toString< / span > < span class = "token punctuation" > (< / span > args< span class = "token punctuation" > )< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span >
< span class = "token keyword" > return< / span > < span class = "token function" > doInvoke< / span > < span class = "token punctuation" > (< / span > args< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 来到了最核心处 < code > org.springframework.web.method.support.InvocableHandlerMethod#doInvoke< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 来到了最核心处< br > < code > org.springframework.web.method.support.InvocableHandlerMethod#doInvoke< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token annotation punctuation" > @Nullable< / span >
< span class = "token keyword" > protected< / span > < span class = "token class-name" > Object< / span > < span class = "token function" > doInvoke< / span > < span class = "token punctuation" > (< / span > < span class = "token class-name" > Object< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > args< span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > Exception< / span > < span class = "token punctuation" > {< / span >
< span class = "token class-name" > Method< / span > method < span class = "token operator" > =< / span > < span class = "token function" > getBridgedMethod< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token class-name" > ReflectionUtils< / span > < span class = "token punctuation" > .< / span > < span class = "token function" > makeAccessible< / span > < span class = "token punctuation" > (< / span > method< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
@ -187,7 +187,7 @@
< span class = "token punctuation" > }< / span >
< span class = "token comment" > // 会走到这里,获取到 bean,而这个 bean 就是前面构造方法里赋值的,最开始被放在 handler 里面,然后调用方法< / span >
< span class = "token keyword" > return< / span > method< span class = "token punctuation" > .< / span > < span class = "token function" > invoke< / span > < span class = "token punctuation" > (< / span > < span class = "token function" > getBean< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ,< / span > args< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < / div > < footer class = post-footer > < div class = post-eof > < / div > < / footer > < / article > < / div > < div class = post-block > < article class = post-content itemscope itemtype = http://schema.org/Article > < link href = https://nicksxs.me/2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ itemprop = mainEntityOfPage > < span hidden itemprop = author itemscope itemtype = http://schema.org/Person > < meta content = /uploads/avatar.jpg itemprop = image > < meta content = Nicksxs itemprop = name > < / span > < span hidden itemprop = publisher itemscope itemtype = http://schema.org/Organization > < meta content = "Nicksxs's Blog" itemprop = name > < meta content = "learn from zero,技术博客,Nicksxs,史学森" itemprop = description > < / span > < span hidden itemprop = post itemscope itemtype = http://schema.org/CreativeWork > < meta content = "undefined | Nicksxs's Blog" itemprop = name > < meta itemprop = description > < / span > < header class = post-header > < h2 itemprop = "name headline" class = post-title > < a class = post-title-link href = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ itemprop = url > springboot web server 启动逻辑< / a > < / h2 > < div class = post-meta-container > < div class = post-meta > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar" > < / i > < / span > < span class = post-meta-item-text > 发表于< / span > < time itemprop = "dateCreated datePublished" title = "创建时间:2023-08-20 17:38:56" datetime = 2023-08-20T17:38:56+08:00 > 2023-08-20< / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar-check" > < / i > < / span > < span class = post-meta-item-text > 更新于< / span > < time title = "修改时间:2023-08-27 22:47:08" datetime = 2023-08-27T22:47:08 +08:00 itemprop = dateModified > 2023-08-27 < / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-folder" > < / i > < / span > < span class = post-meta-item-text > 分类于< / span > < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/ itemprop = url rel = index > < span itemprop = name > Java< / span > < / a > < / span > , < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/SpringBoot/ itemprop = url rel = index > < span itemprop = name > SpringBoot< / span > < / a > < / span > < / span > < span class = "post-meta-item leancloud_visitors" data-flag-title = "springboot web server 启动逻辑" id = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ title = 阅读次数 > < span class = post-meta-item-icon > < i class = "far fa-eye" > < / i > < / span > < span class = post-meta-item-text > 阅读次数:< / span > < span class = leancloud-visitors-count > < / span > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-comment" > < / i > < / span > < span class = post-meta-item-text > Disqus:< / span > < a href = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/#disqus_thread itemprop = discussionUrl title = disqus > < span class = "post-comments-count disqus-comment-count" data-disqus-identifier = 2023/08/20/springboot-web-server-启动逻辑/ itemprop = commentCount > < / span > < / a > < / span > < / div > < / div > < / header > < div class = post-body itemprop = articleBody > < p > springboot 的一个方便之处就是集成了 web server 进去,接着上一篇继续来看下这个 web server 的启动过程< br > 基于 springboot 的 2.2.9.RELEASE 版本< br > 整个 springboot 体系主体就是看 < code > org.springframework.context.support.AbstractApplicationContext#refresh< / code > 刷新方法, < br > 而启动 web server 的方法就是在其中的 O nRefresh< pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > try< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < / div > < footer class = post-footer > < div class = post-eof > < / div > < / footer > < / article > < / div > < div class = post-block > < article class = post-content itemscope itemtype = http://schema.org/Article > < link href = https://nicksxs.me/2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ itemprop = mainEntityOfPage > < span hidden itemprop = author itemscope itemtype = http://schema.org/Person > < meta content = /uploads/avatar.jpg itemprop = image > < meta content = Nicksxs itemprop = name > < / span > < span hidden itemprop = publisher itemscope itemtype = http://schema.org/Organization > < meta content = "Nicksxs's Blog" itemprop = name > < meta content = "learn from zero,技术博客,Nicksxs,史学森" itemprop = description > < / span > < span hidden itemprop = post itemscope itemtype = http://schema.org/CreativeWork > < meta content = "undefined | Nicksxs's Blog" itemprop = name > < meta itemprop = description > < / span > < header class = post-header > < h2 itemprop = "name headline" class = post-title > < a class = post-title-link href = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ itemprop = url > springboot web server 启动逻辑< / a > < / h2 > < div class = post-meta-container > < div class = post-meta > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar" > < / i > < / span > < span class = post-meta-item-text > 发表于< / span > < time itemprop = "dateCreated datePublished" title = "创建时间:2023-08-20 17:38:56" datetime = 2023-08-20T17:38:56+08:00 > 2023-08-20< / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-calendar-check" > < / i > < / span > < span class = post-meta-item-text > 更新于< / span > < time title = "修改时间:2023-09-05 17:27:00" datetime = 2023-09-05T17:27:00 +08:00 itemprop = dateModified > 2023-09-05 < / time > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-folder" > < / i > < / span > < span class = post-meta-item-text > 分类于< / span > < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/ itemprop = url rel = index > < span itemprop = name > Java< / span > < / a > < / span > , < span itemprop = about itemscope itemtype = http://schema.org/Thing > < a href = /categories/Java/SpringBoot/ itemprop = url rel = index > < span itemprop = name > SpringBoot< / span > < / a > < / span > < / span > < span class = "post-meta-item leancloud_visitors" data-flag-title = "springboot web server 启动逻辑" id = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/ title = 阅读次数 > < span class = post-meta-item-icon > < i class = "far fa-eye" > < / i > < / span > < span class = post-meta-item-text > 阅读次数:< / span > < span class = leancloud-visitors-count > < / span > < / span > < span class = post-meta-item > < span class = post-meta-item-icon > < i class = "far fa-comment" > < / i > < / span > < span class = post-meta-item-text > Disqus:< / span > < a href = /2023/08/20/springboot-web-server-%E5%90%AF%E5%8A%A8%E9%80%BB%E8%BE%91/#disqus_thread itemprop = discussionUrl title = disqus > < span class = "post-comments-count disqus-comment-count" data-disqus-identifier = 2023/08/20/springboot-web-server-启动逻辑/ itemprop = commentCount > < / span > < / a > < / span > < / div > < / div > < / header > < div class = post-body itemprop = articleBody > < p > springboot 的一个方便之处就是集成了 web server 进去,接着上一篇继续来看下这个 web server 的启动过程< br > 这边是 基于 springboot 的 2.2.9.RELEASE 版本,整个 springboot 体系主体就是看 < br > < code > org.springframework.context.support.AbstractApplicationContext#refresh< / code > < br > 刷新方法,而启动 web server 的方法就是在其中的 o nRefresh< pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > try< / span > < span class = "token punctuation" > {< / span >
< span class = "token comment" > // Allows post-processing of the bean factory in context subclasses.< / span >
< span class = "token function" > postProcessBeanFactory< / span > < span class = "token punctuation" > (< / span > beanFactory< span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
@ -292,7 +292,7 @@
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > tomcat < span class = "token operator" > =< / span > tomcat< span class = "token punctuation" > ;< / span >
< span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > autoStart < span class = "token operator" > =< / span > autoStart< span class = "token punctuation" > ;< / span >
< span class = "token function" > initialize< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 再调用里面的初始化方法,< code > org.springframework.boot.web.embedded.tomcat.TomcatWebServer#initialize< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > private< / span > < span class = "token keyword" > void< / span > < span class = "token function" > initialize< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > WebServerException< / span > < span class = "token punctuation" > {< / span >
< span class = "token punctuation" > }< / span > < span aria-hidden = true class = line-numbers-rows > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < p > 再调用里面的初始化方法,< br > < code > org.springframework.boot.web.embedded.tomcat.TomcatWebServer#initialize< / code > < pre class = "line-numbers language-java" data-language = java > < code class = language-java > < span class = "token keyword" > private< / span > < span class = "token keyword" > void< / span > < span class = "token function" > initialize< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token keyword" > throws< / span > < span class = "token class-name" > WebServerException< / span > < span class = "token punctuation" > {< / span >
logger< span class = "token punctuation" > .< / span > < span class = "token function" > info< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > "Tomcat initialized with port(s): "< / span > < span class = "token operator" > +< / span > < span class = "token function" > getPortsDescription< / span > < span class = "token punctuation" > (< / span > < span class = "token boolean" > false< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
< span class = "token keyword" > synchronized< / span > < span class = "token punctuation" > (< / span > < span class = "token keyword" > this< / span > < span class = "token punctuation" > .< / span > monitor< span class = "token punctuation" > )< / span > < span class = "token punctuation" > {< / span >
< span class = "token keyword" > try< / span > < span class = "token punctuation" > {< / span >