MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

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

2024-12-30 04:22 huorong 精选文章 5 ℃ 0 评论

在了解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。

Tags:spring的自动装配

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言