Springboot Starter的核心實現原理

FeelTouch發表於2019-05-11

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原始碼分析之工廠載入機制

相關文章