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源码分析之工厂加载机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值