Spring Boot 的自動配置是其核心特性之一,它幫助開發者**"開箱即用"**地使用各種第三方庫或 Spring 組件,而無需手動配置 Bean。這一切的背后,都依賴于 Spring Boot 的自動配置機制。
我們分兩部分來說:
-
Spring Boot 自動配置的整體流程
-
我們依賴的第三方包是如何一步步被自動配置并導入使用的
一、Spring Boot 自動配置的整體流程
1. @SpringBootApplication
注解啟動入口
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
-
@SpringBootApplication
是一個組合注解,包含:-
@SpringBootConfiguration
(實際上就是@Configuration
) -
@EnableAutoConfiguration
-
@ComponentScan
-
2. 關鍵點:@EnableAutoConfiguration
這個注解的作用就是啟用自動配置,底層依賴的是:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
這里的核心邏輯是:導入一批配置類,這些類就定義了我們依賴的組件如何被自動裝配。
3. AutoConfigurationImportSelector 工作機制
-
它會去加載
META-INF/spring.factories
(Spring Boot 2.x) 或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(Spring Boot 3.x)中的配置類列表。 -
這些類就是一堆以
xxxAutoConfiguration
結尾的類,比如:
# META-INF/spring.factories(Spring Boot 2.x)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...
Spring Boot 會按需加載這些自動配置類,也就是判斷你是否引入了相關依賴、是否配置了對應屬性等,來決定要不要配置這個組件。
二、依賴的包是如何一步步自動配置導入的?
舉個例子:我們引入了 spring-boot-starter-data-redis
,程序中就能直接用 RedisTemplate
。
來看這條鏈路是怎么走通的:
步驟 1:你引入了 Redis 的 starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
它的依賴會自動包含:
-
spring-data-redis
-
lettuce-core
(默認客戶端) -
spring-boot-autoconfigure
步驟 2:自動配置類生效
在 spring-boot-autoconfigure
包的 spring.factories
文件中,你會看到:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
這個配置類就被加載了。
步驟 3:RedisAutoConfiguration
中的 Bean 被自動注冊
打開源碼可以看到:
@Configuration
@ConditionalOnClass(RedisOperations.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {...}
}
這表示:
-
如果項目中有 Redis 相關類(即你引入了相關依賴)
-
如果容器里沒有手動注入
RedisTemplate
-
那就自動幫你注冊一個默認的
RedisTemplate
Bean
步驟 4:你就可以在代碼中使用了
@Autowired
private RedisTemplate redisTemplate;
你并沒有顯式配置 Redis 相關的 Bean,但因為自動配置已經做完了,所以直接就能使用。
總結流程圖
@SpringBootApplication↓
@EnableAutoConfiguration↓
AutoConfigurationImportSelector↓
讀取 spring.factories / spring-autoconfigure-metadata↓
加載 xxxAutoConfiguration 類↓
根據條件注冊 Bean(@ConditionalOnClass / OnBean / OnProperty)↓
你就能直接使用這些 Bean
補充:如何自定義或覆蓋自動配置?
-
如果你自己定義了同名 Bean,比如
RedisTemplate
,就會覆蓋自動配置(@ConditionalOnMissingBean 生效)。 -
想要禁用某個自動配置,可以通過:
spring.autoconfigure.exclude:- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
如果你有某個具體依賴包的例子(比如 MyBatis、Kafka、Elasticsearch),我也可以具體分析它的自動配置鏈路。需要的話隨時說~