Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行动态选择。(dubbo中所有的注册信息都是通过URL的形式进行处理的)这里同样采用相同的方式进行实现。
前置内容参考:Dubbo中的SPI中的3.1节。
在dubbo_spi_demo_api的com.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);
}
新增了方法,所以补充实现类

在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);
}
}
hello.service参数,这个参数的值指定的就是具体的实现方式。关于为什么叫hello.service是因为这个接口的名称,其中后面的大写部分被dubbo自动转码为.分割。getAdaptiveExtension来提供一个统一的类来对所有的扩展点提供支持(底层对所有的扩展点进行封装)。URL对象来实现动态的扩展点使用。=号后面的内容就是之前META_INF.dubbo中配置的key

通过@SPI("dog")配置默认值,这样url中如果不传?后面的就以默认值为准

【Dubbo】05. Dubbo SPI中的Adaptive
原文:https://www.cnblogs.com/isdxh/p/14702603.html