让你彻底明白Java SPI与SpringBoot自动配置,内附实例代码演示
创始人
2024-05-14 19:05:54
0

一、Java SPI的概念和术语

SPI:全称是Service Provider Interface:是一种基于ClassLoader来发现并加载服务的机制
SPI由三个组件构成:Service、Service Provider、ServiceLoader

  • Service:是一个公开的接口或抽象类,定义了一个抽象的功能模块
  • Service Provider:是Service的实现类
  • ServiceLoader:是SPI机制中的核心组件,负责在运行时发现并加载Service Provider

二、Java SPI的运行流程

在这里插入图片描述

三、Java SPI在JDBC中的应用

  1. 在Java SPI出现之前,我们是这样来使用JDBC的
    在这里插入图片描述
  2. JDBC要求Driver实现类在类加载的时候,能将自身的实例对象自动注册到DriverManager中,从而加载数据库驱动。
    在这里插入图片描述
  3. Java SPI逐渐融入JDBC
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、Java SPI的三大规范要素

  1. 规范的配置文件
    在这里插入图片描述
    在JDBC中的对应实现
    在这里插入图片描述
  2. Service Provider类必须具备无参的默认构造方法
    在这里插入图片描述
    在JDBC中的对应实现
    在这里插入图片描述
  3. 保证能加载到配置文件和Service Provider类
    在这里插入图片描述
    在JDBC中的对应实现
    在这里插入图片描述
    总结:上述除了导包需要自己动手以外,其他的手续都是导包之后,Java SPI自动完成的

五、从0开始,手撸一个SPI的应用实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、总体流程

在这里插入图片描述

七、SpringBoot自动配置

参考视频:每一帧都是干货!15分钟的视频花2小时看

  1. 配置类(Configuration Class)
    广义的配置类:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括了@Configuration类
    侠义的配置类:特指被注解@Configuration所修饰的某个类,又称为@Configuration类

  2. SpringBoot自动配置实例

  • 引入依赖
org.springframework.bootspring-boot-starter-data-redis

  • 配置Redis服务器
spring:redis:database:0host:127.0.0.1port:6379password:123456
  • 直接使用RedisTemplate或StringRedisTemplate
@Autowired
private RedisTemplate redisTemplate;@Autowired
private StringRedisTemplate stringRedisTemplate;
  • 提出问题:自动配置
  • 我们除了通过maven引入一个starter外,其他什么也没有做,但是呢,SpringBoot就自动完成了Redis的配置,将相关的Bean对象注册到IOC容器中了。那么SpringBoot是如何做到这一点的呢?这就是这篇博客所要说明的问题了。
  1. 自动配置,一切从注解@SpringBootApplicaiton说起
  • @SpringBootApplication注解
    在这里插入图片描述
  • Spring SPI机制与Spring Factories机制
    Spring SPI超简单
    在这里插入图片描述
  • 下面我们逐步分析@EnableAutoConfiguration的自动配置
  • @SpringBootApplication
  • @EnableAutoConfiguration
  • @Import(AutoConfigurationImportSelector.class)
  • AutoConfigurationImportSelector.class的关键代码selectImports()方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata){if(!isEnabled(annotationMetadata))return NO_IMPORTS;AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);//SpringBoot自动配置的入口方法AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationErtadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
  • selectImports()方法中引用的getAutoConfigurationEntry()
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,AnnotationMetadata annotationMetadata){//1. 获取annotationMetadata的注解@EnableAutoConfiguration的属性AnnotationAttributes attributes = getAttributes(annotationMetadata);//2. 从资源文件Spring.factories中获取EnableAutoConfiguration对应的所有的类List configurations = getCandidateConfigurations(annotationMetadata, attributes);//3. 通过在注解@EnableAutoConfiguration设置exclude的相关属性,可以排除指定的自动配置类Set exclusions = getExclusions(anntationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);//4. 根据注解@Conditional来判断是否需要排除某些自动配置类configurations filter = filter(configurations, autoConfigurationMetadata);//5. 触发AutoConfiguration导入的相关事件fireAutoCOnfigurationImportEvents(configurations, exclusions);return new AutofigurationEntry(configurations, exclusions);
}
  • getAutoConfigurationEntry()引用的getCandidateConfigurations()
protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes){//通过SpringFactories机制,从配置文件Spring.factories中找出所有的自动配置类List configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, getBeanClassLoader());Assert.notEmpty(configurations,"No auto configuration classes found");return configurations;
}
  • getCandidateConfigurations方法,选择META-IF/spring.factories的,EnableAutoConfiguration类
    在这里插入图片描述

四、@EnableAutoConfiguration自动配置总体流程

在这里插入图片描述

五、这里是给我自己提个醒

META-IF/spring.factories是在Maven引入的Jar包中,每一个Jar都有自己META-IF/spring.factories,所以SpringBoot是去每一个Jar包里面寻找META-IF/spring.factories,而不是我的项目中存在META-IF/spring.factories(当然也可以存在,但是我项目的META-IF/spring.factories肯定没有类似以下这些东西)
在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...