网站首页 > 精选文章 / 正文
在了解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的自动装配
猜你喜欢
- 2024-12-30 阿里二面:详细讲讲SpringBoot自动装配
- 2024-12-30 刨析 SpringBoot 自动装配原理,其实很简单
- 2024-12-30 SpringBoot 自动装配原理,一文掌握!
- 2024-12-30 一文学会Springboot的自动装配机制
- 2024-12-30 深度剖析Spring Boot自动装配机制实现原理
- 2024-12-30 SpringBoot 自动装配原理 springboot自动装配流程图
- 2024-12-30 SpringBoot自动装配-Import的使用与详解
- 2024-12-30 Spring Boot 自动装配核心揭秘 spring boot的自动装配
- 2024-12-30 Spring Boot 自动装配原理剖析 springboot自动装配流程图
- 2024-12-30 万字长文详解SpringBoot自动装配原理及源码,不够细你来找我