springboot之自動(dòng)裝配全過程
Spring Boot 實(shí)現(xiàn)自動(dòng)裝配的關(guān)鍵在于其自動(dòng)配置機(jī)制(Auto-Configuration)和基于注解的配置。以下是 Spring Boot 實(shí)現(xiàn)自動(dòng)裝配的主要原理和步驟:
1. @SpringBootApplication 注解
@SpringBootApplication 是一個(gè)組合注解,它包含了三個(gè)重要的注解:@EnableAutoConfiguration、@ComponentScan 和 @Configuration。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}@EnableAutoConfiguration:?jiǎn)⒂?Spring Boot 的自動(dòng)配置機(jī)制。@ComponentScan:?jiǎn)⒂媒M件掃描,以便找到帶有@Component、@Service、@Repository、@Controller等注解的 Spring 組件。@Configuration:表明這個(gè)類是一個(gè)配置類,可以包含@Bean定義。
2. 自動(dòng)配置(Auto-Configuration)
@EnableAutoConfiguration 注解觸發(fā)自動(dòng)配置。
Spring Boot 會(huì)根據(jù)類路徑中的依賴、屬性文件中的配置以及其他環(huán)境變量來判斷并自動(dòng)配置應(yīng)用所需的 Bean。
自動(dòng)配置的實(shí)現(xiàn)原理
Spring Boot 的自動(dòng)配置機(jī)制依賴于 spring.factories 文件,該文件位于 META-INF 目錄下。
這個(gè)文件列出了所有的自動(dòng)配置類(Auto-Configuration Classes)。
例如,Spring Boot 的 spring-boot-autoconfigure JAR 包中的 spring.factories 文件部分內(nèi)容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ ...
這些自動(dòng)配置類會(huì)在 Spring 應(yīng)用上下文初始化時(shí)被加載,并根據(jù)條件自動(dòng)配置相應(yīng)的 Bean。
3. 條件裝配
自動(dòng)配置類通常使用條件注解(Conditional Annotations)來控制 Bean 的裝配。這些注解包括:
@ConditionalOnClass:只有在指定的類在類路徑上存在時(shí)才會(huì)裝配 Bean。@ConditionalOnMissingBean:只有在指定的 Bean 不存在時(shí)才會(huì)裝配 Bean。@ConditionalOnProperty:只有在指定的屬性存在并具有特定值時(shí)才會(huì)裝配 Bean。
例如,DataSourceAutoConfiguration 類:
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(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();
}
}4. 組件掃描(Component Scan)
@ComponentScan 注解啟用組件掃描,Spring 會(huì)掃描指定包及其子包中的所有組件(帶有 @Component、@Service、@Repository、@Controller 等注解的類),并將它們注冊(cè)為 Spring Bean。
@SpringBootApplication
@ComponentScan(basePackages = "com.example.myapp")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}5. 配置類(Configuration Class)
@Configuration 注解用于定義配置類,這些類可以包含一個(gè)或多個(gè) @Bean 方法。
每個(gè) @Bean 方法定義了一個(gè) Bean,并將其注冊(cè)到 Spring 應(yīng)用上下文中。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}6. 使用 @Autowired 注入依賴
Spring 通過 @Autowired 注解實(shí)現(xiàn)依賴注入。
@Autowired 可以應(yīng)用于構(gòu)造器、方法和字段,Spring 會(huì)自動(dòng)注入相應(yīng)的 Bean。
@Service
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
// 或者通過字段注入
@Autowired
private MyRepository myRepository;
}總結(jié)
Spring Boot 通過一系列注解和條件配置實(shí)現(xiàn)了自動(dòng)裝配機(jī)制,使得開發(fā)者無需手動(dòng)配置大量的 XML 文件或 Java 配置類。
自動(dòng)配置機(jī)制利用 spring.factories 文件中的自動(dòng)配置類,并結(jié)合條件注解和組件掃描,實(shí)現(xiàn)了靈活且強(qiáng)大的自動(dòng)裝配功能。
這樣,開發(fā)者可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而無需處理繁瑣的配置細(xì)節(jié)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot多環(huán)境打包與配置文件排除實(shí)踐記錄
本文介紹了SpringBoot項(xiàng)目多環(huán)境打包與配置文件排除實(shí)踐,包括多環(huán)境配置的實(shí)現(xiàn)方法、打包時(shí)排除配置文件的方法以及動(dòng)態(tài)加載外部配置文件的最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2024-11-11
Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換
這篇文章主要介紹了Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Java實(shí)現(xiàn)五子棋(附詳細(xì)源碼)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Java LocalDateTime轉(zhuǎn)Json報(bào)錯(cuò)處理方案
在使用LocalDateTime進(jìn)行JSON轉(zhuǎn)換時(shí),需添加Jackson JSR310模塊并配置注解,或通過自定義工具處理,解決序列化異常問題2025-07-07
基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)
本項(xiàng)目基于Java SSM框架實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),主要實(shí)現(xiàn)系統(tǒng)的在線點(diǎn)餐功能。文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-02-02
Java中線程的等待與喚醒_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在Object.java中,定義了wait(), notify()和notifyAll()等接口。wait()的作用是讓當(dāng)前線程進(jìn)入等待狀態(tài),同時(shí),wait()也會(huì)讓當(dāng)前線程釋放它所持有的鎖。下面通過本文給大家介紹Java中線程的等待與喚醒知識(shí),感興趣的朋友一起看看吧2017-05-05
簡(jiǎn)單總結(jié)SpringMVC攔截器的使用方法
今天給大家?guī)淼氖顷P(guān)于SpringMVC攔截器的相關(guān)知識(shí),文章圍繞著SpringMVC攔截器的使用方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java使用Spring AI的10個(gè)實(shí)用技巧分享
在當(dāng)今的軟件開發(fā)領(lǐng)域,人工智能的集成已經(jīng)成為提升應(yīng)用功能和用戶體驗(yàn)的重要手段,對(duì)于 Java 開發(fā)者而言,Spring AI 提供了一套強(qiáng)大且便捷的工具,本文將深入探討 Java 使用 Spring AI 的 10 個(gè)實(shí)用技巧,感興趣的小伙伴跟著小編一起來看看吧2025-06-06
ArrayList的自動(dòng)擴(kuò)充機(jī)制實(shí)例解析
本文主要介紹了ArrayList的自動(dòng)擴(kuò)充機(jī)制,由一個(gè)題目切入主題,逐步向大家展示了ArrayList的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10

