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

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

前言

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

 

JDK实现

1、定义SPI接口

深入剖析Spring boot自动装配原理一(SPI)_第1张图片

2、SPI接口的多个实现

深入剖析Spring boot自动装配原理一(SPI)_第2张图片

深入剖析Spring boot自动装配原理一(SPI)_第3张图片

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

深入剖析Spring boot自动装配原理一(SPI)_第4张图片

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

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

深入剖析Spring boot自动装配原理一(SPI)_第5张图片

深入剖析Spring boot自动装配原理一(SPI)_第6张图片

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

深入剖析Spring boot自动装配原理一(SPI)_第7张图片

深入剖析Spring boot自动装配原理一(SPI)_第8张图片

深入剖析Spring boot自动装配原理一(SPI)_第9张图片重点关注PREFIX = "META-INF/services/"、hasNextService方法和nextService方法,首先在classpath下的META-INF/services/找到SPI接口classname的对应的配置文件,然后将其所有配置的类读取到configs中,在通过反射的方式对配置的bean进行实例化,由此就解开了SPI 对应bean的具体实例化过程。

不足之处:

  • 不能按需加载,需要遍历配置文件中所有的实现并实例化。
  • 不能很直接的获取某个实例化对象,只能通过迭代的形式获取
  • 非线程安全

Spring 实现

Spring主要通过SpringFactoriesLoader来进行实现

深入剖析Spring boot自动装配原理一(SPI)_第10张图片

深入剖析Spring boot自动装配原理一(SPI)_第11张图片

深入剖析Spring boot自动装配原理一(SPI)_第12张图片

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

 

你可能感兴趣的:(spring,boot,spring,java,spring,boot)