網站首頁 編程語言 正文
什么是 SpringBoot 自動裝配?
SpringBoot 定義了一套接口規范,這套規范規定:SpringBoot 在啟動時會掃描外部引用 jar 包中的
META-INF/spring.factories
文件,將文件中配置的類型信息加載到 Spring 容器(此處涉及到 JVM 類加載機制與 Spring 的容器知識),并執行類中定義的各種操作。對于外部 jar 來說,只需要按照 SpringBoot 定義的標準,就能將自己的功能裝置進 SpringBoot。
沒有 Spring Boot 的情況下,如果我們需要引入第三方依賴,需要手動配置,非常麻煩。但是,Spring Boot 中,我們直接引入一個 starter 即可。比如你想要在項目中使用 redis 的話,直接在項目中引入對應的 starter 即可。?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
引入 starter 之后,我們通過少量注解和一些簡單的配置就能使用第三方組件提供的功能了。
在我看來,自動裝配可以簡單理解為:通過注解或者一些簡單的配置就能在 Spring Boot 的幫助下實現某塊功能。
SpringBoot 是如何實現自動裝配的?
我們先看一下 SpringBoot 的核心注解?SpringBootApplication
大概可以把?@SpringBootApplication
看作是?@Configuration
、@EnableAutoConfiguration
、@ComponentScan
?注解的集合。根據 SpringBoot 官網,這三個注解的作用分別是:
-
@EnableAutoConfiguration
:啟用 SpringBoot 的自動配置機制 -
@Configuration
:允許在上下文中注冊額外的 bean 或導入其他配置類 -
@ComponentScan
: 掃描被@Component
?(@Service
,@Controller
)注解的 bean,注解默認會掃描啟動類所在的包下所有的類 ,可以自定義不掃描某些 bean。
@EnableAutoConfiguration
?是實現自動裝配的重要注解,我們以這個注解入手?:
EnableAutoConfiguration
?只是一個簡單地注解,自動裝配核心功能的實現實際是通過?AutoConfigurationImportSelector
類.
AutoConfigurationImportSelector
類的繼承體系如下:
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
}
public interface DeferredImportSelector extends ImportSelector {
}
public interface ImportSelector {
String[] selectImports(AnnotationMetadata var1);
}
AutoConfigurationImportSelector
?類實現了?ImportSelector
接口,也就實現了這個接口中的?selectImports
方法,該方法主要用于獲取所有符合條件的類的全限定類名,這些類需要被加載到 IoC 容器中。?
結合getAutoConfigurationEntry()
的源碼
private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry();
AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
//<1>.
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
//<2>.
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
//<3>.
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
//<4>.
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
?總結:
Spring Boot 通過@EnableAutoConfiguration
開啟自動裝配,通過 SpringFactoriesLoader 最終加載META-INF/spring.factories
中的自動配置類實現自動裝配,自動配置類其實就是通過@Conditional
按需加載的配置類,想要其生效必須引入spring-boot-starter-xxx
包實現起步依賴
原文鏈接:https://blog.csdn.net/weixin_67588007/article/details/126334915
- 上一篇:Redis 數據刪除策略
- 下一篇:Spring 解決循環依賴
相關推薦
- 2022-06-12 教你十行代碼實現python向手機推送通知功能_python
- 2022-08-12 Go單元測試對GORM進行Mock測試_Golang
- 2023-02-27 pandas中concatenate和combine_first的用法詳解_python
- 2023-07-04 解讀Linux常用命令使用方法
- 2022-11-17 Go語言學習教程之指針的示例詳解_Golang
- 2023-03-04 Google大佬都用的廣播goAsync源碼分析_Android
- 2022-12-10 OpenMP深入剖析reduction子句教程_C 語言
- 2022-06-28 ASP.NET?WebAPI導入CSV_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支