亲宝软件园·资讯

展开

Java是如何实现自己的SPI机制的? JDK源码(一)

源码笔记 人气:0
**注:该源码分析对应JDK版本为1.8** # 1 引言 这是【源码笔记】的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码。 # 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是Service Provider Interface 的简称,即**服务提供者接口**的意思。根据字面意思我们可能还有点困惑,SPI说白了就是一种扩展机制,我们在相应配置文件中定义好某个接口的实现类,然后再根据这个接口去这个配置文件中加载这个实例类并实例化,其实SPI就是这么一个东西。说到SPI机制,我们最常见的就是Java的SPI机制,此外,还有Dubbo和SpringBoot自定义的SPI机制。 有了SPI机制,那么就为一些框架的灵活扩展提供了可能,而不必将框架的一些实现类写死在代码里面。 那么,某些框架是如何利用SPI机制来做到灵活扩展的呢?下面举几个栗子来阐述下: 1. **JDBC驱动加载案例**:利用Java的SPI机制,我们可以根据不同的数据库厂商来引入不同的JDBC驱动包; 2. **SpringBoot的SPI机制**:我们可以在`spring.factories`中加上我们自定义的自动配置类,事件监听器或初始化器等; 3. **Dubbo的SPI机制**:Dubbo更是把SPI机制应用的**淋漓尽致**,Dubbo基本上自身的每个功能点都提供了扩展点,比如提供了集群扩展,路由扩展和负载均衡扩展等差不多接近30个扩展点。如果Dubbo的某个内置实现不符合我们的需求,那么我们只要利用其SPI机制将我们的实现替换掉Dubbo的实现即可。 上面的三个栗子先让我们直观感受下某些框架利用SPI机制是如何做到灵活扩展的。 # 3 如何使用Java的SPI? 我们先来看看如何使用Java自带的SPI。 先定义一个`Developer`接口 ```java // Developer.java package com.ymbj.spi; public interface Developer { void sayHi(); } ``` 再定义两个`Developer`接口的两个实现类: ```java // JavaDeveloper.java package com.ymbj.spi; public class JavaDeveloper implements Developer { @Override public void sayHi() { System.out.println("Hi, I am a Java Developer."); } } ``` ```java // PythonDeveloper.java package com.ymbj.spi; public class PythonDeveloper implements Developer { @Override public void sayHi() { System.out.println("Hi, I am a Python Developer."); } } ``` 然后再在项目`resources`目录下新建一个`META-INF/services`文件夹,然后再新建一个以`Developer`接口的全限定名命名的文件,文件内容为: ```java // com.ymbj.spi.Developer文件 com.ymbj.spi.JavaDeveloper com.ymbj.spi.PythonDeveloper ``` 最后我们再新建一个测试类`JdkSPITest`: ```java // JdkSPITest.java public class JdkSPITest { @Test public void testSayHi() throws Exception { ServiceLoader

加载全部内容

相关教程
猜你喜欢
用户评论