一文徹底弄懂spring?boot自動(dòng)配置的過(guò)程(推薦)
Spring Boot 的自動(dòng)配置機(jī)制是它的重要特性之一,極大地簡(jiǎn)化了 Spring 應(yīng)用的配置工作。自動(dòng)配置的核心思想是基于類(lèi)路徑中的依賴(lài)、環(huán)境配置以及自定義代碼進(jìn)行智能化配置,避免了開(kāi)發(fā)者手動(dòng)編寫(xiě)大量的樣板代碼。
接下來(lái),我將詳細(xì)介紹 Spring Boot 自動(dòng)配置的過(guò)程,核心原理以及涉及的關(guān)鍵組件,并結(jié)合源碼進(jìn)行深入解析。
一、Spring Boot 自動(dòng)配置的工作流程
@SpringBootApplication注解自動(dòng)配置的起點(diǎn)通常是@SpringBootApplication注解,它是一個(gè)組合注解,包含了三個(gè)重要注解:其中
@EnableAutoConfiguration是自動(dòng)配置的核心,它引導(dǎo)自動(dòng)配置機(jī)制。@SpringBootConfiguration:標(biāo)記為一個(gè) Spring 配置類(lèi),類(lèi)似于@Configuration。@EnableAutoConfiguration:?jiǎn)⒂?Spring Boot 的自動(dòng)配置機(jī)制。@ComponentScan:掃描當(dāng)前包及其子包下的所有 Spring 組件。
@EnableAutoConfiguration 和 AutoConfigurationImportSelector@EnableAutoConfiguration 注解的作用是告訴 Spring Boot 啟動(dòng)時(shí)自動(dòng)配置 Spring 應(yīng)用上下文。該注解引入了 AutoConfigurationImportSelector,這是自動(dòng)配置的核心處理器。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}AutoConfigurationImportSelector 類(lèi)會(huì)從配置文件中(通常是 spring.factories)讀取所有的自動(dòng)配置類(lèi),并將它們導(dǎo)入到應(yīng)用上下文中。
spring.factories 文件自動(dòng)配置類(lèi)是通過(guò) spring-boot-autoconfigure 模塊的 META-INF/spring.factories 文件來(lái)配置的。這個(gè)文件中列出了所有可以被自動(dòng)加載的配置類(lèi):
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,\ ...
這些配置類(lèi)會(huì)在 Spring Boot 啟動(dòng)時(shí)根據(jù)當(dāng)前環(huán)境條件被選擇性加載。
條件裝配(
@Conditional系列注解)Spring Boot 并不是盲目地加載所有的自動(dòng)配置類(lèi)。每個(gè)自動(dòng)配置類(lèi)通常都會(huì)使用@Conditional系列注解來(lái)進(jìn)行有條件的加載。最常見(jiàn)的條件注解有:例如,
DataSourceAutoConfiguration只有在項(xiàng)目中存在數(shù)據(jù)源相關(guān)的依賴(lài)(如javax.sql.DataSource類(lèi))時(shí)才會(huì)被加載。@ConditionalOnClass:當(dāng)類(lèi)路徑中存在某個(gè)類(lèi)時(shí)才生效。@ConditionalOnMissingBean:當(dāng) Spring 上下文中不存在某個(gè) Bean 時(shí)才生效。@ConditionalOnProperty:當(dāng)某個(gè)配置屬性滿(mǎn)足特定條件時(shí)才生效。@ConditionalOnBean:當(dāng) Spring 上下文中存在某個(gè) Bean 時(shí)才生效。
自動(dòng)配置類(lèi)示例:DataSourceAutoConfiguration
Spring Boot 中 DataSourceAutoConfiguration 是配置數(shù)據(jù)源的自動(dòng)配置類(lèi),它的源碼如下:
@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 對(duì)象
return properties.initializeDataSourceBuilder().build();
}
}這種基于條件的配置方式確保了 Spring Boot 的靈活性,允許用戶(hù)通過(guò)覆蓋默認(rèn) Bean 或不滿(mǎn)足條件的方式跳過(guò)某些自動(dòng)配置。
@ConditionalOnClass(DataSource.class):只有當(dāng)類(lèi)路徑下存在DataSource類(lèi)時(shí),才進(jìn)行數(shù)據(jù)源的自動(dòng)配置。@ConditionalOnMissingBean:如果 Spring 上下文中沒(méi)有其他DataSourceBean,則自動(dòng)配置一個(gè)。
二、Spring Boot 自動(dòng)配置的核心步驟
- 收集自動(dòng)配置類(lèi)啟動(dòng)時(shí),
AutoConfigurationImportSelector從spring.factories文件中讀取所有的自動(dòng)配置類(lèi),并通過(guò)@Import導(dǎo)入這些類(lèi)。 - 條件檢查自動(dòng)配置類(lèi)的加載不是無(wú)條件的,Spring Boot 會(huì)根據(jù)
@Conditional注解進(jìn)行條件檢查,確保只有符合條件的自動(dòng)配置類(lèi)才會(huì)生效。 - 注入所需的 Bean一旦自動(dòng)配置類(lèi)通過(guò)條件檢查,Spring Boot 就會(huì)根據(jù)這些配置類(lèi)注冊(cè)所需的 Bean。例如,
DataSourceAutoConfiguration會(huì)自動(dòng)配置數(shù)據(jù)源相關(guān)的 Bean。 - 允許用戶(hù)覆蓋自動(dòng)配置自動(dòng)配置并不是強(qiáng)制的。用戶(hù)可以通過(guò)顯式聲明自己的 Bean 來(lái)覆蓋自動(dòng)配置的默認(rèn)行為。例如,如果用戶(hù)在自己的配置類(lèi)中定義了
DataSource,那么 Spring Boot 就不會(huì)再自動(dòng)配置數(shù)據(jù)源。
三、Spring Boot 自動(dòng)配置的實(shí)際案例
Web 應(yīng)用自動(dòng)配置在 Spring Boot Web 應(yīng)用中,
DispatcherServletAutoConfiguration負(fù)責(zé)自動(dòng)配置 Spring MVC 的核心組件,例如DispatcherServlet、RequestMappingHandlerMapping等。- 如果項(xiàng)目中存在
spring-web依賴(lài),那么DispatcherServletAutoConfiguration會(huì)自動(dòng)加載。 - 如果沒(méi)有手動(dòng)定義
DispatcherServlet,Spring Boot 會(huì)自動(dòng)創(chuàng)建一個(gè)DispatcherServlet并配置到 Spring 容器中。
- 如果項(xiàng)目中存在
數(shù)據(jù)庫(kù)連接池自動(dòng)配置Spring Boot 還會(huì)自動(dòng)配置數(shù)據(jù)庫(kù)連接池(如 HikariCP、Tomcat JDBC 等),這依賴(lài)于項(xiàng)目中的 spring-boot-starter-data-jpa 或者 spring-boot-starter-jdbc 依賴(lài)。
同時(shí),用戶(hù)可以通過(guò) application.properties 文件來(lái)自定義連接池配置:
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共同負(fù)責(zé)自動(dòng)配置數(shù)據(jù)源。- 如果類(lèi)路徑中存在連接池類(lèi)(如
HikariDataSource),那么 Spring Boot 就會(huì)自動(dòng)配置連接池。 Spring Security 自動(dòng)配置當(dāng)引入
spring-boot-starter-security依賴(lài)時(shí),Spring Boot 會(huì)自動(dòng)配置安全機(jī)制,默認(rèn)提供 HTTP Basic 認(rèn)證機(jī)制。SecurityAutoConfiguration負(fù)責(zé)自動(dòng)配置 Spring Security 的基礎(chǔ)設(shè)施。- 如果需要定制安全策略,可以通過(guò)自定義
WebSecurityConfigurerAdapter來(lái)覆蓋默認(rèn)配置。
四、Spring Boot 自動(dòng)配置的好處
- 極大地簡(jiǎn)化配置工作:開(kāi)發(fā)者不再需要為每個(gè)基礎(chǔ)設(shè)施組件編寫(xiě)配置代碼,自動(dòng)配置機(jī)制根據(jù)項(xiàng)目依賴(lài)自動(dòng)注入所需的 Bean。
- 靈活性:自動(dòng)配置并不會(huì)束縛開(kāi)發(fā)者。開(kāi)發(fā)者可以通過(guò)自定義配置輕松覆蓋默認(rèn)的自動(dòng)配置。
- 約定優(yōu)于配置:Spring Boot 遵循 "約定優(yōu)于配置" 的原則,只需少量的配置,Spring Boot 就能完成復(fù)雜的初始化工作。
五、Spring Boot 自動(dòng)配置與 Spring 自動(dòng)裝配的區(qū)別
- Spring 自動(dòng)裝配:指通過(guò)
@Autowired等注解,根據(jù)類(lèi)型自動(dòng)注入依賴(lài) Bean。它側(cè)重于注入已經(jīng)配置好的 Bean。 - Spring Boot 自動(dòng)配置:是根據(jù)類(lèi)路徑中的依賴(lài)和環(huán)境信息自動(dòng)配置 Spring 組件的過(guò)程。它負(fù)責(zé)創(chuàng)建并配置所需的基礎(chǔ)設(shè)施 Bean。
總結(jié)來(lái)說(shuō),Spring Boot 的自動(dòng)配置機(jī)制通過(guò) @EnableAutoConfiguration 啟動(dòng),基于 spring.factories 中的配置和 @Conditional 條件判斷,自動(dòng)注入所需的 Bean,簡(jiǎn)化了開(kāi)發(fā)者的配置工作,同時(shí)保留了靈活的定制能力。
到此這篇關(guān)于一文徹底弄懂spring boot自動(dòng)配置的過(guò)程的文章就介紹到這了,更多相關(guān)spring boot自動(dòng)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明
這篇文章主要介紹了Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Spring @Bean vs @Service注解區(qū)別
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Java中數(shù)組的一些常見(jiàn)操作和技巧分析
這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的一些常見(jiàn)操作和技巧分析的相關(guān)資料,數(shù)組(Array)是Java中的一種引用數(shù)據(jù)類(lèi)型,是多個(gè)相同類(lèi)型數(shù)據(jù)一定順序排列的集合,并使用一個(gè)名字命名,并通過(guò)編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理,需要的朋友可以參考下2023-08-08
Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解
這篇文章主要介紹了Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
java內(nèi)存模型jvm虛擬機(jī)簡(jiǎn)要分析
Java 內(nèi)存模型的主要目的是定義程序中各種變量的訪問(wèn)規(guī)則, 關(guān)注在虛擬機(jī)中把變量值存儲(chǔ)到內(nèi)存和從內(nèi)存中取出變量值這樣的底層細(xì)節(jié)2021-09-09
Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字時(shí)鐘功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字時(shí)鐘功能,涉及java日期時(shí)間及JFrame框架圖形界面操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02
淺析SpringBoot2.4 靜態(tài)資源加載問(wèn)題
這篇文章主要介紹了SpringBoot2.4 靜態(tài)資源加載問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

