我是靠谱客的博主 受伤盼望,最近开发中收集的这篇文章主要介绍java的SPI扩展机制_浅谈Java领域中的SPI扩展机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在Java领域,有一种重要的服务扩展机制,即SPI,它在编写框架和项目应用中起着重要的作用。SPI的英文全称为service provider interface,即服务提供接口,在JDK、Spring和Dubbo中都有它的存在。

我个人认为,SPI存在最根本的目的是实现模块或组件的可插拔性,核心思想那便是解耦了。

一、JDK

在JDK的java.util包下有一个非常显眼的类,即ServiceLoader。不妨打开该类的源码,看到注释的第一行是A simple service-provider loading facility,用我粗大的英语能力翻译出大概意思是一个简单的服务提供者加载工具。是的,你没有看错,这就是JDK中SPI机制的核心类。

43a1ff6bd1e988636040321137e99394.png

使用JDK的SPI,需要遵循如下规则:

1、当服务提供方提供接口的具体实现后,在classpath下创建META-INF/services目录。

2、再创建一个以接口全限定名命名的配置文件,将实现类的全类名写入文件。

3、通过ServiceLoader加载模块。

6e03fcfc844b5decc3df56792ad08aa7.png

简单示例:

首先定义一个接口

public interface Animal {

void sound();

}

接下来定义两个实现类,分别是Dog和Cat

public class Dog implements Animal {

@Override

public void sound(){

System.out.println("汪汪汪的叫");

}

}

public class Cat implements Animal {

@Override

public void sound(){

System.out.println("喵喵喵的叫");

}

}

然后在classpath下创建META-INF/services目录,创建文件以Animal的全类名命名,比如com.xxx.Animal,文件内写入两个实现类的全类名,如下:

com.xxx.Dog

com.xxx.Cat

最后编写测试代码

public class Test {

public static void main(String[] args) {

ServiceLoaderserviceLoader = ServiceLoader.load(Animal.class);

serviceLoader.forEach(Animal::sound);

}

}

测试结果如下

"C:Program FilesJavajdk1.8.0_191binjava.exe" "-javaagent:C:Program

汪汪汪的叫

喵喵喵的叫

二、Spring和Dubbo

如果理解了JDK的SPI机制,那么Spring和Dubbo中的SPI也就理解了,原理是一样的,只是实现的方式有些许区别。

Spring中SPI的核心类:

ac33718a5d769203b4e94e0901a1071f.png

Dubbo中SPI的核心类:

281e688ab181f3d3a52b6cad7a73b924.png

Spring、Dubbo 和JDK SPI实现的区别:

1、配置文件路径不同

2、配置文件内容书写方式不同

3、编码方式不同

最后

以上就是受伤盼望为你收集整理的java的SPI扩展机制_浅谈Java领域中的SPI扩展机制的全部内容,希望文章能够帮你解决java的SPI扩展机制_浅谈Java领域中的SPI扩展机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部