<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/doc/framework/spring/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/doc/framework/spring/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/doc/framework/spring/springboot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/framework/spring/springboot/</guid><description>&lt;h2 id="启动流程">
 启动流程
 &lt;a class="anchor" href="#%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="流程图">
 流程图
 &lt;a class="anchor" href="#%e6%b5%81%e7%a8%8b%e5%9b%be">#&lt;/a>
&lt;/h3>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/framework/springboot/process.png" alt="" width="90%">&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="伪代码">
 伪代码
 &lt;a class="anchor" href="#%e4%bc%aa%e4%bb%a3%e7%a0%81">#&lt;/a>
&lt;/h3>
&lt;blockquote>
&lt;p>main方法启动： &lt;code>SpringApplication.run(SpringbootApplication.class, args);&lt;/code> &lt;br>
new SpringApplication(sources).run(); &lt;br>&lt;/p>
&lt;/blockquote>
&lt;p>SpringApplication#init构造器中的初始化过程&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">private void initialize(Object[] sources) {
 if (sources != null &amp;amp;&amp;amp; sources.length &amp;gt; 0) {
 this.sources.addAll(Arrays.asList(sources));
 }
 this.webEnvironment = deduceWebEnvironment();
 setInitializers((Collection) getSpringFactoriesInstances(
 ApplicationContextInitializer.class));
 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
 this.mainApplicationClass = deduceMainApplicationClass();
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;p>SpringApplication#run&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public ConfigurableApplicationContext run(String... args) {
 StopWatch stopWatch = new StopWatch();
 stopWatch.start();
 ConfigurableApplicationContext context = null;
 FailureAnalyzers analyzers = null;
 configureHeadlessProperty();
 SpringApplicationRunListeners listeners = getRunListeners(args);
 listeners.starting();
 try {
 ApplicationArguments applicationArguments = new DefaultApplicationArguments(
 args);
 ConfigurableEnvironment environment = prepareEnvironment(listeners,
 applicationArguments);
 Banner printedBanner = printBanner(environment);
 context = createApplicationContext();
 analyzers = new FailureAnalyzers(context);
 prepareContext(context, environment, listeners, applicationArguments,
 printedBanner);
 refreshContext(context);
 afterRefresh(context, applicationArguments);
 listeners.finished(context, null);
 stopWatch.stop();
 if (this.logStartupInfo) {
 new StartupInfoLogger(this.mainApplicationClass)
 .logStarted(getApplicationLog(), stopWatch);
 }
 return context;
 }
 catch (Throwable ex) {
 handleRunFailure(context, listeners, analyzers, ex);
 throw new IllegalStateException(ex);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;/ul>
&lt;h2 id="自动装配">
 自动装配
 &lt;a class="anchor" href="#%e8%87%aa%e5%8a%a8%e8%a3%85%e9%85%8d">#&lt;/a>
&lt;/h2>
&lt;h2 id="reference">
 Reference
 &lt;a class="anchor" href="#reference">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>


 &lt;a href="https://blog.csdn.net/weixin_44947701/article/details/124055713" rel="noopener" target="_blank">https://blog.csdn.net/weixin_44947701/article/details/124055713&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title/><link>https://archive-w.netlify.app/doc/framework/spring/springmvc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/framework/spring/springmvc/</guid><description>&lt;h2 id="springmvc-执行流程">
 springmvc 执行流程
 &lt;a class="anchor" href="#springmvc-%e6%89%a7%e8%a1%8c%e6%b5%81%e7%a8%8b">#&lt;/a>
&lt;/h2>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/framework/springmvc/process.png" alt="">&lt;/p>
&lt;h2 id="过滤器">
 过滤器
 &lt;a class="anchor" href="#%e8%bf%87%e6%bb%a4%e5%99%a8">#&lt;/a>
&lt;/h2>
&lt;h2 id="拦截器">
 拦截器
 &lt;a class="anchor" href="#%e6%8b%a6%e6%88%aa%e5%99%a8">#&lt;/a>
&lt;/h2>
&lt;h2 id="数据绑定">
 数据绑定
 &lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e7%bb%91%e5%ae%9a">#&lt;/a>
&lt;/h2>
&lt;h2 id="消息转换器">
 消息转换器
 &lt;a class="anchor" href="#%e6%b6%88%e6%81%af%e8%bd%ac%e6%8d%a2%e5%99%a8">#&lt;/a>
&lt;/h2>
&lt;h2 id="异常处理">
 异常处理
 &lt;a class="anchor" href="#%e5%bc%82%e5%b8%b8%e5%a4%84%e7%90%86">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>注解ExceptionHandler&lt;/p>
&lt;blockquote>
&lt;p>注解ExceptionHandler作用对象为方法，最简单的使用方法就是放在controller文件中，详细的注解定义不再介绍。
如果项目中有多个controller文件，通常可以在baseController中实现ExceptionHandler的异常处理，而各个contoller继承basecontroller从而达到统一异常处理的目的。因为比较常见，简单代码如下：&lt;/p>
&lt;/blockquote>
 &lt;details>&lt;summary>单个controller处理&lt;/summary>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">@ExceptionHandler(Exception.class)
@ResponseBody
public String exceptionHandler(Exception ex){
 return this.getClass().getSimpleName() + &amp;quot;: &amp;quot; + ex.getMessage();
} 
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/details>
&lt;/li>
&lt;li>
&lt;p>注解ControllerAdvice&lt;/p>
&lt;blockquote>
&lt;p>这里虽说是ControllerAdvice注解，其实是其与ExceptionHandler的组合使用。
在上文中可以看到，单独使用@ExceptionHandler时，其必须在一个Controller中，然而当其与ControllerAdvice组合使用时就完全没有了这个限制。换句话说，二者的组合达到的全局的异常捕获处理。&lt;/p>
&lt;p>&lt;code>***&lt;/code> 注解ControllerAdvice 等级低于第一个。而且第一个只处理当前Controller。顺序为 @ExceptionHandler,@ControllerAdvice,HandlerExceptionResolver&lt;/p>
&lt;/blockquote>
 &lt;details>&lt;summary>全局异常处理&lt;/summary>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">@ControllerAdvice
public class ExceptionHandlerAdvice {
 //也可以出现 自定义Exception，和其他Exception
 @ExceptionHandler(Exception.class)
 @ResponseBody
 public String exceptionHandler(Exception ex){
 return this.getClass().getSimpleName() + &amp;quot;: &amp;quot; + ex.getMessage();
 }
} 
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/details>
&lt;/li>
&lt;li>
&lt;p>实现HandlerExceptionResolver接口&lt;/p></description></item></channel></rss>