Spring Boot 之所以能“開箱即用”,其核心就在于 自動配置機制(Auto Configuration)。本文將深入剖析 Spring Boot 自動配置的工作原理,從注解入手,再到底層的源碼機制,揭開 Spring Boot 背后的“魔法”。
一、自動配置的初印象
使用 Spring Boot 時,只需加上 @SpringBootApplication
注解,就能啟動整個應用,而不需要手動配置 XML 或繁瑣的 Java Config。
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
但你有沒有想過,是誰幫我們把 Tomcat、DataSource、MVC 等配置都準備好了?
答案就是:Spring Boot 自動配置機制。
二、自動配置的核心注解:@EnableAutoConfiguration
@SpringBootApplication
是一個組合注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
}
其中最關鍵的就是:
@EnableAutoConfiguration
它的作用就是開啟 Spring Boot 自動配置功能。
三、@EnableAutoConfiguration 背后的秘密
3.1 @EnableAutoConfiguration 的核心實現
查看源碼我們會發現,它用到了 Spring 的 @Import 注解:
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
也就是說,它將 AutoConfigurationImportSelector
注冊為配置類導入器。
3.2 AutoConfigurationImportSelector 的作用
這個類會掃描 META-INF/spring.factories
文件,并加載所有的自動配置類:
private static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
它會讀取其中類似如下的內容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
...
這些類就是所謂的 自動配置類(AutoConfiguration Class)。
四、自動配置類的本質
以 DataSourceAutoConfiguration
為例:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {...
}
可以看到,它本質上是一個普通的 @Configuration
配置類,但加了一堆 條件注解(Conditional 系列)。
五、@Conditional 系列注解實現條件加載
自動配置類并不是一定會生效,而是根據當前環境判斷是否生效:
注解 | 功能說明 |
---|---|
@ConditionalOnClass | 類路徑中有某個類時才生效 |
@ConditionalOnMissingBean | Spring 容器中沒有指定 Bean 時才生效 |
@ConditionalOnProperty | 某個配置屬性存在或為指定值時生效 |
@ConditionalOnWebApplication | 是 Web 應用時才生效 |
通過這些注解,Spring Boot 實現了高度解耦、按需加載的自動配置機制。
六、spring.factories 的加載機制
這些自動配置類從哪里來?都定義在 jar 包的:
META-INF/spring.factories
這個文件中,EnableAutoConfiguration
會對應很多個自動配置類列表,它們分布在不同的模塊中。
Spring Boot 啟動時,會統一通過 SpringFactoriesLoader
加載這些類。
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader);
七、自定義自動配置(進階)
你也可以自己編寫自動配置類:
- 新建配置類
@Configuration
- 加上
@Conditional
條件注解 - 注冊到
META-INF/spring.factories
@Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
}
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration
這樣,當配置開啟時(my.feature.enabled=true
),你的自動配置才會生效。
八、@SpringBootApplication 到底做了什么?
總結起來,@SpringBootApplication
做了三件大事:
@SpringBootConfiguration
: 表示這是一個配置類@ComponentScan
: 啟動包掃描,自動發現注解的 Bean@EnableAutoConfiguration
: 啟動自動配置機制
九、小結:Spring Boot 自動配置的工作流程
graph TD
A[啟動類 @SpringBootApplication] --> B[@EnableAutoConfiguration]
B --> C[導入 AutoConfigurationImportSelector]
C --> D[加載 spring.factories]
D --> E[篩選滿足條件的自動配置類]
E --> F[按需注冊 Bean 到容器中]
這就是 Spring Boot 自動配置的核心原理:通過注解+條件判斷+SPI 加載機制,實現了按需配置,極大簡化了開發流程。
十、參考資料
- Spring Boot 官方文檔
- Spring 源碼分析
- 《Spring 實戰》第五版