【Dubbo】05. Dubbo SPI中的Adaptive

05. Dubbo中的Adaptive

1. 什么是Adaptive功能

Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行动态选择。(dubbo中所有的注册信息都是通过URL的形式进行处理的)这里同样采用相同的方式进行实现。

2. 实现方式

前置内容参考:Dubbo中的SPI中的3.1节。

2.1

dubbo_spi_demo_apicom.dxh.service.HelloService中新增一个方法,该方法有一个参数URL(import org.apache.dubbo.common.URL),且该方法使用@Adaptive注解。

package com.dxh.service;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.Adaptive;
import org.apache.dubbo.common.extension.SPI;
//这里的“增加的dog”是默认值
@SPI("dog")
public interface HelloService {
    String sayHello();
    
    @Adaptive
    String sayHello(URL url);
}

2.2

新增了方法,所以补充实现类

2.3

dubbo_spi_demo_main中新建类

package com.dxh;
import com.dxh.service.HelloService;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;

public class DubboSpiMainTestAdaptive {
    public static void main(String[] args) {
        HelloService adaptiveExtension = ExtensionLoader.getExtensionLoader(HelloService.class).getAdaptiveExtension();
        URL url = URL.valueOf("test://localhost/hi?hello.service=human");
        String hello = adaptiveExtension.sayHello(url);
        System.out.println(hello);
    }
}

注释:

  • 因为在这里只是临时测试,所以为了保证URL规范,前面的信息均为测试值即可,关键的点在于hello.service参数,这个参数的值指定的就是具体的实现方式。关于为什么叫hello.service是因为这个接口的名称,其中后面的大写部分被dubbo自动转码为.分割。
  • 通过getAdaptiveExtension来提供一个统一的类来对所有的扩展点提供支持(底层对所有的扩展点进行封装)。
  • 调用时通过参数中增加URL对象来实现动态的扩展点使用。

=号后面的内容就是之前META_INF.dubbo中配置的key
截屏2021-04-25 下午11.01.38

通过@SPI("dog")配置默认值,这样url中如果不传后面的就以默认值为准
截屏2021-04-25 下午11.09.01

原文地址:https://www.cnblogs.com/isdxh/p/14702603.html