Springboot Starter的核心實現原理
spring.factories
在從nacos-spring-boot-project角度全面看Springboot Starter中,我們提到過從spring.factories中找出key為XXX的類。比如org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的NacosConfigAutoConfiguration
中會在spring.factories檔案中找出key為EnableAutoConfiguration對應的值。這些類都是自動化配置類:
// 這個spring.factories檔案在spring-boot-autoconfigure模組的 META-INF/spring.factories中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration
Spring Framework內部使用一種工廠載入機制(Factory Loading Mechanism)。這種機制使用SpringFactoriesLoader完成,SpringFactoriesLoader使用loadFactories方法載入並例項化從META-INF目錄裡的spring.factories檔案出來的工廠,這些spring.factories檔案都是從classpath裡的jar包裡找出來的。
spring.factories檔案是以Java的Properties格式存在,key是介面或抽象類的全名、value是以逗號 " , " 分隔的實現類,比如:
example.MyService=example.MyServiceImpl1,example.MyServiceImpl2
其中example.MyService是介面的全名,example.MyServiceImpl1和example.MyServiceImpl2是這個介面的兩種實現。
可通過SpringFactoriesLoader完成:
List<String> classes = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, this.getClass().getClassLoader());
classes.forEach(clazz -> {
System.out.println("==== " + clazz);
});
總結:
工廠載入機制是Spring內部提供的一個約定俗成的載入方式。只需要在模組的META-INF目錄下定義Properties格式的spring.factories檔案,這個Properties格式的檔案中的key是介面或抽象類的全名,value是以逗號 " , " 分隔的實現類。
SpringBoot中的autoconfigure模組中的spring.factories就存在於META-INF目錄下:
├── META-INF
│ ├── MANIFEST.MF
│ ├── additional-spring-configuration-metadata.json
│ ├── maven
│ │ └── org.springframework.boot
│ │ └── spring-boot-autoconfigure
│ │ ├── pom.properties
│ │ └── pom.xml
│ ├── spring-configuration-metadata.json
│ └── spring.factories
├── org
│ └── springframework
│ └── boot
│ └── autoconfigure
│ ├── AbstractDependsOnBeanFactoryPostProcessor.class
....
而且也定義了一些配置,比如自動化配置資訊:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=...
應用初始化器:
org.springframework.context.ApplicationContextInitializer=...
應用監聽器:
org.springframework.context.ApplicationListener=...
模板可用提供器:
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=...
我們只需要遵守這個機制並在對應的檔案中寫出需要載入的介面和例項即可,或者自己使用SpringFactoriesLoader實現載入。
相關文章
- springboot核心原理Spring Boot
- Docker的核心實現原理Docker
- 深入理解SpringBoot核心機制《spring-boot-starter》Spring Boot
- 實戰|如何自定義SpringBoot Starter?Spring Boot
- springboot自學(6)springboot核心原理Spring Boot
- Spring Boot 自動配置的原理、核心註解以及利用自動配置實現了自定義 Starter 元件Spring Boot元件
- SpringBoot 自定義 starterSpring Boot
- SpringBoot如何建立starterSpring Boot
- SpringBoot自定義StarterSpring Boot
- Redis核心原理與實踐--列表實現原理之ziplistRedis
- 如何實現自己的Spring Boot StarterSpring Boot
- springboot+MDCAdapter自定義starter實現日誌全鏈路追蹤Spring BootAPT
- RPC核心實現原理-動態代理RPC
- springboot-starter中的SPI 機制Spring Boot
- 【Mysql核心技術】聊聊事務的實現原理MySql
- Redis核心原理與實踐--列表實現原理之quicklist結構RedisUI
- 理解Laravel中介軟體核心實現原理Laravel
- Laravel 核心--深入剖析 Laravel 框架 Jwt 元件的實現原理Laravel框架JWT元件
- 手擼一個SpringBoot-StarterSpring Boot
- SpringBoot原理發現(一)Spring Boot
- SpringBoot應用篇(一):自定義starterSpring Boot
- 圖解kubernetes控制器StatefulSet核心實現原理圖解
- 圖解 kubernetes 控制器 StatefulSet 核心實現原理圖解
- 微服務架構的核心要點和實現原理解析微服務架構
- SpringBoot自定義starter開發分散式任務排程實踐Spring Boot分散式
- OAM 創始團隊:揭秘 OAM Kubernetes 實現核心原理
- springboot 接入shardingsphere-jdbc-core-spring-boot-starterSpring BootJDBC
- 從頭帶你擼一個Springboot StarterSpring Boot
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- SpringBoot | SpringBoot 是如何實現日誌的?Spring Boot
- _007_SpringBoot_SpringBoot的核心檔案Spring Boot
- SpringBoot實現mongoDB的CRUDSpring BootMongoDB
- 【SpringBoot實戰】核心配置和註解Spring Boot
- JDK ThreadPoolExecutor核心原理與實踐JDKthread
- Category的實現原理Go
- Vitepress 的實現原理Vite
- synchronized 的實現原理synchronized
- ACID的實現原理