硬核解析!Spring Boot 3.4 啟動原理全揭秘,細節拉滿!
Spring Boot 作為 Java 生態中的核心框架,已經徹底改變了 Java Web 開發的方式。它通過 "約定優于配置" 和強大的自動化配置能力,大幅提升了開發效率。然而,盡管 Spring Boot 被廣泛使用,很多開發者在實際應用中只是停留在表層使用,而沒有深入理解它的底層實現。例如,在面試或架構設計討論中,Spring Boot 啟動原理往往是考察點之一,但很多人對其核心機制了解不深。
本篇文章將帶你深入剖析 Spring Boot 3.4 的啟動流程,解析 @SpringBootApplication、@EnableAutoConfiguration 及其背后的自動化配置機制,幫助你構建對 Spring Boot 的深層次認知。
@SpringBootApplication 注解解析
要理解 Spring Boot 的自動化配置,必須先從 @SpringBootApplication 注解入手,它是整個 Spring Boot 啟動過程的起點。先來看其源碼:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters ={
@Filter(type =FilterType.CUSTOM, classes =TypeExcludeFilter.class),
@Filter(type =FilterType.CUSTOM, classes =AutoConfigurationExcludeFilter.class)
})
public@interfaceSpringBootApplication{
}
該注解實際上是多個注解的組合:
- @SpringBootConfiguration:標識該類為 Spring Boot 配置類。
- @EnableAutoConfiguration:啟用自動化配置(核心)。
- @ComponentScan:自動掃描當前包及子包下的 Spring 組件。
其中,@EnableAutoConfiguration 是 Spring Boot 自動化配置的關鍵,我們接下來重點分析它的實現。
@EnableAutoConfiguration 的實現機制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
這里的 @Import(AutoConfigurationImportSelector.class) 是關鍵,它會導入 AutoConfigurationImportSelector,進而加載各種自動化配置類。
AutoConfigurationImportSelector 解析
@Override
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
() -> String.format("Only %s implementations are supported, got %s",
AutoConfigurationImportSelector.class.getSimpleName(),
deferredImportSelector.getClass().getName()));
AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
.getAutoConfigurationEntry(annotationMetadata);
this.autoConfigurationEntries.add(autoConfigurationEntry);
for (String importClassName : autoConfigurationEntry.getConfigurations()) {
this.entries.putIfAbsent(importClassName, annotationMetadata);
}
}
該方法的核心作用是解析 AutoConfigurationImportSelector 并獲取 AutoConfigurationEntry,最終將自動化配置類注冊到 Spring 容器中。
getAutoConfigurationEntry 方法分析
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
該方法執行了如下關鍵步驟:
- 通過 getCandidateConfigurations 方法獲取所有候選自動化配置類。
- 過濾掉重復項,并移除 exclusions 中排除的配置類。
- 觸發自動化配置導入事件。
getCandidateConfigurations 方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList<>(
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you " +
"are using a custom packaging, make sure that file is correct.");
return configurations;
}
這里的自動化配置類來源有兩個:
- META-INF/spring.factories 文件:用戶自定義的 starter 會在這里聲明自動化配置類。
- META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件:Spring Boot 內置的自動化配置類。
如果這兩個地方都沒有找到自動化配置類,將會拋出異常。
Spring Boot 3.4 啟動機制總結
Spring Boot 3.4 的啟動流程依賴于 @EnableAutoConfiguration 及其背后的 AutoConfigurationImportSelector 機制,核心原理如下:
- @SpringBootApplication 觸發 @EnableAutoConfiguration 機制。
- @EnableAutoConfiguration 通過 AutoConfigurationImportSelector 解析并加載 META-INF/spring.factories 或 AutoConfiguration.imports 中定義的自動化配置類。
- 解析后的自動化配置類注冊到 Spring 容器,完成自動配置。
結論
理解 Spring Boot 的啟動機制不僅能幫助開發者更高效地排查問題,還能在面對面試或架構設計時提供更強的技術支撐。Spring Boot 3.4 的自動化配置機制雖然復雜,但掌握其核心原理后,我們就可以更自由地擴展 Spring Boot 的能力,如自定義 Starter、優化應用性能等。