一文徹底弄懂spring?boot自動配置的過程(推薦)
Spring Boot 的自動配置機制是它的重要特性之一,極大地簡化了 Spring 應用的配置工作。自動配置的核心思想是基于類路徑中的依賴、環(huán)境配置以及自定義代碼進行智能化配置,避免了開發(fā)者手動編寫大量的樣板代碼。
接下來,我將詳細介紹 Spring Boot 自動配置的過程,核心原理以及涉及的關鍵組件,并結合源碼進行深入解析。
一、Spring Boot 自動配置的工作流程
@SpringBootApplication注解自動配置的起點通常是@SpringBootApplication注解,它是一個組合注解,包含了三個重要注解:其中
@EnableAutoConfiguration是自動配置的核心,它引導自動配置機制。@SpringBootConfiguration:標記為一個 Spring 配置類,類似于@Configuration。@EnableAutoConfiguration:啟用 Spring Boot 的自動配置機制。@ComponentScan:掃描當前包及其子包下的所有 Spring 組件。
@EnableAutoConfiguration 和 AutoConfigurationImportSelector@EnableAutoConfiguration 注解的作用是告訴 Spring Boot 啟動時自動配置 Spring 應用上下文。該注解引入了 AutoConfigurationImportSelector,這是自動配置的核心處理器。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}AutoConfigurationImportSelector 類會從配置文件中(通常是 spring.factories)讀取所有的自動配置類,并將它們導入到應用上下文中。
spring.factories 文件自動配置類是通過 spring-boot-autoconfigure 模塊的 META-INF/spring.factories 文件來配置的。這個文件中列出了所有可以被自動加載的配置類:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ ...
這些配置類會在 Spring Boot 啟動時根據當前環(huán)境條件被選擇性加載。
條件裝配(
@Conditional系列注解)Spring Boot 并不是盲目地加載所有的自動配置類。每個自動配置類通常都會使用@Conditional系列注解來進行有條件的加載。最常見的條件注解有:例如,
DataSourceAutoConfiguration只有在項目中存在數據源相關的依賴(如javax.sql.DataSource類)時才會被加載。@ConditionalOnClass:當類路徑中存在某個類時才生效。@ConditionalOnMissingBean:當 Spring 上下文中不存在某個 Bean 時才生效。@ConditionalOnProperty:當某個配置屬性滿足特定條件時才生效。@ConditionalOnBean:當 Spring 上下文中存在某個 Bean 時才生效。
自動配置類示例:DataSourceAutoConfiguration
Spring Boot 中 DataSourceAutoConfiguration 是配置數據源的自動配置類,它的源碼如下:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({DataSourcePoolMetadataProvidersConfiguration.class,
DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
// 創(chuàng)建并返回 DataSource 對象
return properties.initializeDataSourceBuilder().build();
}
}這種基于條件的配置方式確保了 Spring Boot 的靈活性,允許用戶通過覆蓋默認 Bean 或不滿足條件的方式跳過某些自動配置。
@ConditionalOnClass(DataSource.class):只有當類路徑下存在DataSource類時,才進行數據源的自動配置。@ConditionalOnMissingBean:如果 Spring 上下文中沒有其他DataSourceBean,則自動配置一個。
二、Spring Boot 自動配置的核心步驟
- 收集自動配置類啟動時,
AutoConfigurationImportSelector從spring.factories文件中讀取所有的自動配置類,并通過@Import導入這些類。 - 條件檢查自動配置類的加載不是無條件的,Spring Boot 會根據
@Conditional注解進行條件檢查,確保只有符合條件的自動配置類才會生效。 - 注入所需的 Bean一旦自動配置類通過條件檢查,Spring Boot 就會根據這些配置類注冊所需的 Bean。例如,
DataSourceAutoConfiguration會自動配置數據源相關的 Bean。 - 允許用戶覆蓋自動配置自動配置并不是強制的。用戶可以通過顯式聲明自己的 Bean 來覆蓋自動配置的默認行為。例如,如果用戶在自己的配置類中定義了
DataSource,那么 Spring Boot 就不會再自動配置數據源。
三、Spring Boot 自動配置的實際案例
Web 應用自動配置在 Spring Boot Web 應用中,
DispatcherServletAutoConfiguration負責自動配置 Spring MVC 的核心組件,例如DispatcherServlet、RequestMappingHandlerMapping等。- 如果項目中存在
spring-web依賴,那么DispatcherServletAutoConfiguration會自動加載。 - 如果沒有手動定義
DispatcherServlet,Spring Boot 會自動創(chuàng)建一個DispatcherServlet并配置到 Spring 容器中。
- 如果項目中存在
數據庫連接池自動配置Spring Boot 還會自動配置數據庫連接池(如 HikariCP、Tomcat JDBC 等),這依賴于項目中的 spring-boot-starter-data-jpa 或者 spring-boot-starter-jdbc 依賴。
同時,用戶可以通過 application.properties 文件來自定義連接池配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret spring.datasource.hikari.maximum-pool-size=10
DataSourceAutoConfiguration和DataSourceProperties共同負責自動配置數據源。- 如果類路徑中存在連接池類(如
HikariDataSource),那么 Spring Boot 就會自動配置連接池。 Spring Security 自動配置當引入
spring-boot-starter-security依賴時,Spring Boot 會自動配置安全機制,默認提供 HTTP Basic 認證機制。SecurityAutoConfiguration負責自動配置 Spring Security 的基礎設施。- 如果需要定制安全策略,可以通過自定義
WebSecurityConfigurerAdapter來覆蓋默認配置。
四、Spring Boot 自動配置的好處
- 極大地簡化配置工作:開發(fā)者不再需要為每個基礎設施組件編寫配置代碼,自動配置機制根據項目依賴自動注入所需的 Bean。
- 靈活性:自動配置并不會束縛開發(fā)者。開發(fā)者可以通過自定義配置輕松覆蓋默認的自動配置。
- 約定優(yōu)于配置:Spring Boot 遵循 "約定優(yōu)于配置" 的原則,只需少量的配置,Spring Boot 就能完成復雜的初始化工作。
五、Spring Boot 自動配置與 Spring 自動裝配的區(qū)別
- Spring 自動裝配:指通過
@Autowired等注解,根據類型自動注入依賴 Bean。它側重于注入已經配置好的 Bean。 - Spring Boot 自動配置:是根據類路徑中的依賴和環(huán)境信息自動配置 Spring 組件的過程。它負責創(chuàng)建并配置所需的基礎設施 Bean。
總結來說,Spring Boot 的自動配置機制通過 @EnableAutoConfiguration 啟動,基于 spring.factories 中的配置和 @Conditional 條件判斷,自動注入所需的 Bean,簡化了開發(fā)者的配置工作,同時保留了靈活的定制能力。
到此這篇關于一文徹底弄懂spring boot自動配置的過程的文章就介紹到這了,更多相關spring boot自動配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring @Bean vs @Service注解區(qū)別
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

