如何利用spi机制去指定接口具体实现? #java底层

createh51周前 (12-20)技术教程20

如何利用 spi 机制去指定接口具体实现?

兄弟们,今天来聊一下如何利用 spi 机制去指定接口的具体实现。

1. 为什么要聊这个问题呢?因为在平时的开发过程中可能会经常遇到这样一种场景,比如在程序里面指定了一个接口就是 myService,同时它有两个实现类就是 myService1 和 myService2。

2. 此时有一个需求,想要获取 myService 接口下面的 myService1 实现类,而不想要获取 myService2 的实现类。这时如果写代码,肯定是获取接口下面所有的实现类,并且把 myService2 排除,myService1 暴露出来。

3. 此时过了几天又有了一个新的需求,想要获取 myService2 实现类,同时不想要获取 myService1。此时又要去改代码,去获取接口下面所有的实现类,把 myService1 暴露出来,myService1 屏蔽掉。

4. 有没有想过一个问题,就是在修改的时候可能会引入一个新的异常,所以今天要聊的 spi 机制正好就是通过一个配置文件去指定接口到底使用哪个实现类。同时在单目里面可以看到这个方法就可以从配置文件去获取这里面指定的具体的实现类就是 myService1。

5. 再看一下 myService1 的实现方法,就是这个,获取就是 myService.execute,可以先去执行一下,执行完之后会发现正好获取的就是 myService1 实现类。此时改成 myService2 实现类,再去运行一下代码。

6. 其实这块的使用场景还是很多的,比如 jdbc 既可以整合 oracle 也可以整合 mysql,如何去整合?就是通过 spi 机制,比如去接入了一个 oracle 的包,它的 driver 默认就是 oracle 的 driver,具体的实现也是 oracle 的那一套。如果引用了 mysql 的包,它引用的是买 mysql 那一套具体的实现,所以 SPI 机制用的还是很广的。

7. 问题来了,它有几个重要的点一定要注意一下。首先需要在 resources 文件里面去写一个 META-INF/services 文件夹的名字,一定要注意,一定是这个名字不能写错。同时这里面的文件的名字一定是接口的全类名,它里面写的值一定是接口里面实现的全类名。所以就可以通过这个方法从配置里面去找到接口的具体实现类。

相关文章

Linux从头学:16张结构图,彻底理解「代码重定位」的底层原理

目录程序的结构1. 程序头(Header)的描述信息2. 关于汇编地址bootloader 把程序从硬盘读取到内存1. 读取到内存中的什么位置?2. bootloader 设置数据段基地址3. boo...

一文带你掌握Java框架的底层灵魂:反射 ,框架源码再也不头大了

1.反射是什么Java反射是框架的灵魂,大量框架底层都用到了反射机制,例如Spring....Java反射是在运行状态时,可以构造任何一个类的对象,获取到任意一个对象所属的类信息,以及这个类的成员变量...

Volatile的实现原理(看这篇就够了)

谈到并发编程就不得不提到并发三要素:原子性、可见性、有序性,而Volatile就会涉及到可见性与有序性,可见Volatile在并发编程的重要的地位。所以需要重点掌握Volatile,为了助大家掌握好V...

一文带你了解 Redis 的发布与订阅的底层原理

01、前言发布订阅系统在我们日常的工作中经常会使用到,这种场景大部分情况我们都是使用消息队列的,常用的消息队列有 Kafka,RocketMQ,RabbitMQ,每一种消息队列都有其特性,关于 Kaf...

阿里架构师整理一份企业级SSM架构实战文档,让你熟悉底层原理

前言通常我们按规模把软件分为小型软件、中型软件和大型软件,而大型软件的应用客户都是大型企业或商业组织等,所以业内习惯将大型软件称为企业级应用。传统的企业级应用开发提供的是信息化解决方案和应用软件,需要...

Java程序员必会Synchronized底层原理剖析

synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。但不可否认的是synchro...