深入剖析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接口

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。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值