深入剖析Spring boot自动装配原理一(SPI)

在了解Spring boot自动装配原理之前,需要了解两个很重要的知识点Java SPI机制和Spring的Import注解,把这两个重要的点理解清楚之后就很容易理解Spring boot的自动装配原理了,并且能很好的应用到实际项目中。

 

前言

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。大家最熟悉的的应用场景有Common-Logging,JDBC等。

 

JDK实现

1、定义SPI接口

2、SPI接口的多个实现

 

3、在classpath下创建META-INF/services/目录,并且在该目录下创建一个文件配置文件com.qd.demo.spi.AnimalSPI(该文件名为SPI接口全路径)

 

文件中的内容为SPI接口具体的实现类(可多个)

4、通过jdk中ServiceLoader读取配置文件对SPI实现类形式实例化

 

通过该过程可以了解到SPI是面向接口编程,不关注接口的具体实现,由配置文件配置具体要实例化的厂商接口。JDK也提供了具体的实现,我们一起来看看ServiceLoader是如何实现的,通过load方法跟入JDK源码(以下至列出核心代码)。

 

 

重点关注PREFIX = "META-INF/services/"、hasNextService方法和nextService方法,首先在classpath下的META-INF/services/找到SPI接口classname的对应的配置文件,然后将其所有配置的类读取到configs中,在通过反射的方式对配置的bean进行实例化,由此就解开了SPI 对应bean的具体实例化过程。

不足:

不能按需加载,需要遍历配置文件中所有的实现并实例化。

不能很直接的获取某个实例化对象,只能通过迭代的形式获取。

 非线程安全。

Spring 实现

Spring主要通过SpringFactoriesLoader来进行实现

 

 

Spring通过classpath下META-INF/spring.factories配置文件,找到需要实例化的类进行实例化,其读取配置文件方式与jdk一致,但是比jdk更优势的地方是能指定bean进行实例化,如截图就指定了BeanInfoFactory的实例化子类为ExtendedBeanInfoFactory。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容