Spring Factories机制
那么这篇文章是根据这位博主的文章我看完之后收获很多然后自己精简了自己想记录的写了下来:
首先就是什么事Spring Factoryies机制:
Spring Factories机制和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多spring的starter 包中都可以看到,通过读取 META-INF/spring.factories文件中的配置指定自动配置类入口,然后在程序中读取这些配置文件并实例化,从而让框架加载该类实现jar的动态加载。比如我们自定义的一些Spring Boot Starter公共组件就可以使用Spring Factories机制,通过极简的配置就可以在需要使用组件的地方引入依赖直接使用。
什么是SPI机制呢:
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。
我们可以通过源码找到SpringFactoriesLoader这个核心类:并且直接映入眼帘的就是第一行的那个
FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
这个 META-INF/spring.factories在我们的启动类中相当的熟悉了。
而这个SpringFactoriesLoader核心类,就是对这个路径下的配置类进行扫描,这个核心类中有两个核心方法:
- loadFactories 根据接口类获取其实现类的实例,这个方法返回的是对象列表。
- loadFactoryNames 根据接口获取其接口类的名称,这个方法返回的是类名的列表。
就是这俩玩意,通过这两个方法进行了全限定类名的列表,以及通过全限定类名,利用反射机制返回这些全限定类名的对象列表。从而便于Springboot进行自动注入。也就是我们说的自动装配。