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

createh55个月前 (12-20)技术教程50

如何利用 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 文件夹的名字,一定要注意,一定是这个名字不能写错。同时这里面的文件的名字一定是接口的全类名,它里面写的值一定是接口里面实现的全类名。所以就可以通过这个方法从配置里面去找到接口的具体实现类。

相关文章

volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理

Tips:最近面试,但凡是个像样的公司面试官都得问我对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!本文记录...

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

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

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

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

java面试题分享|Gateway 和 MyBatis 的底层实现及设计模式深入理解

面试官的问题确实是在考察你对 Spring Cloud Gateway 和 MyBatis 的底层实现及设计模式的了解。Spring Cloud Gateway 底层实现底层框架:Spring Clo...

MySQL存储底层技术:InnoDB底层原理解读

存储引擎很多文章都是直接开始介绍有哪些存储引擎,并没有去介绍存储引擎本身。那么究竟什么是存储引擎?不知道大家有没有想过,MySQL是如何存储我们丢进去的数据的?其实存储引擎也很简单,我认为就是一种存储...