《Dubbo中的SPI机制》每天三分钟搞定Java面试

1、 什么是SPI

SPI是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。

2、SPI可以解决什么问题

SPI,可以大大增加了系统的拓展性,比如在核心代码里面就只要加载配置文件,这样如果有一天新增了逻辑,核心代码是不用变的,唯一变的就是自己工程里面的配置文件和新增类(后面也会举例说明)

3、使用举例

比如常见的JDBC、SLF4J

4、SPI的使用

1)JDK中的SPI机制

在resources/META-INF/services目录创建文件,文件名称必须跟接口的完整限定名相同

这个接口文件中配置了该接口的所有实现类的完整限定名

// 扫描对应 services 下的所有类文件并进行匹配
ServiceLoader all = ServiceLoader.load(SomeInteface.class);
// 或者对应接口下所有的实现类
Iterator iterator = all.iterator();

2)Dubbo中的SPI机制

Double支持spi的路径:
META-INF/dubbo
META-INF/dubbo/internal
META-INF/services

1.指定名字的扩展点

// 举例:通过名称获取对应拓展的实现类
RandomLoadBalance rd = 
  (RandomLoadBalance)ExtensionLoader.getExtensionLoader(Loadbalance.class)
  .getExtension("random");

2.自适应扩展点(在运行期间,根据上下文来决定当前返回哪个扩展点)

@Adaptive

1、该注解可以声明在类级别上

2、也可以声明在方法级别

实现原理

1、如果修饰在类级别,那么直接返回修饰的类

2、如果修饰在方法界别,动态创建一个代理类(javassist)

Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

3.激活扩展点

相当于Spring中的conditional,根据条件进行激活

ExtensionLoader
extensionLoader=ExtensionLoader.getExtensionLoader(Filter.class);
URL url=new URL("","",0);
url=url.addParameter("cache","cache");
List filters = extensionLoader.getActivateExtension(url,"cache");
展开阅读全文

页面更新:2024-03-09

标签:机制   路径   接口   级别   声明   核心   完整   代码   文件   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top