總結springboot在啟動過程中,會對啟動失敗的原因及異常進行診斷,並列印報告
初始化階段:載入springboot內建配置的分析器
準備階段:設定bean工廠/環境配置
分析階段:遍歷呼叫分析器,只要有分析結果返回
診斷分析模組主要分為:分析器、報告呈現
分析入口類
入口類:failureanalyzers
構造器
this(context, null);
} assert.notnull(context, "context must not be null");
this.classloader = (classloader == null ? context.getclassloader() : classloader);
// 初始化分析器
this.analyzers = loadfailureanalyzers(this.classloader);
preparefailureanalyzers(this.analyzers, context);
}// 從spring.factory檔案中讀取分析器
private listloadfailureanalyzers(classloader classloader)
catch (throwable ex)
} annotationawareordercomparator.sort(analyzers);
return analyzers;}
分析報告核心方法
public boolean analyzeandreport(throwable failure)
private failureanalysis analyze(throwable failure, listanalyzers)
} catch (throwable ex)
} return null;
}private boolean report(failureanalysis analysis, classloader classloader)
// 遍歷呼叫報告介面,生成報告
for (failureanalysisreporter reporter : reporters)
return true;
}
分析器
分析介面:failureanalyzer
抽象類:abstractfailureanalyzer->analyze(throwable failure)
public failureanalysis analyze(throwable failure)
return null;
}protected final e findcause(throwable failure, classtype)
failure = failure.getcause();
} return null;
}
具體實現類:portinusefailureanalyzer(其中的乙個實現類)
class portinusefailureanalyzer extends abstractfailureanalyzer
}
報告器
報告介面:failureanalysisreporter
核心方法:void report(failureanalysis analysis); // 對分析結果進行報告呈現
具體實現類:loggingfailureanalysisreporter,主要進行日誌列印
public final class loggingfailureanalysisreporter implements failureanalysisreporter
// error模式下列印自定義錯誤資訊
if (logger.iserrorenabled())
} private string buildmessage(failureanalysis failureanalysis)
return builder.tostring();
}}
雖然該模組比較簡單,但很有指導意義,將異常處理專門封裝成乙個模組,易於擴充套件,易於理解
使用了模版方法模式,抽象類abstractfailureanalyzer定義了基本流程,子類去實現,擴充套件性較好
功能模組劃分清晰:將整個流程分為分析和報告兩個大的階段,耦合度低
springboot原始碼略讀
springboot的精髓是自動依賴注入。那麼哪些能自動注入呢,開啟spring boot autoconfigure,jar下的spring.factories。可以看到一堆這樣的配置 auto configure org.springframework.boot.autoconfigure.en...
SpringBoot原始碼分析
public class 第乙個引數 resourceloader 資源載入器 第二個引數 primarysources 載入的主要資源類 suppresswarnings public resourceloader resourceloader,class primarysources deduc...
Spring Boot 原始碼分析
1 專案初始化過程 springboot啟動類 springboot的啟動很簡單,如下 public static void main string args this.resourceloader resourceloader initialize sources private void ini...