Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension 统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行
动态选择。 (dubbo中所有的注册信息都是通过URL的形式进行处理的。)这里同样采用相同的方式进行实现。
(1)创建接口
View Code
api中的 HelloService 扩展如下方法,在sayHello方法上增加 @Adaptive 注解,并且在参数中提供URL参数.注意这里的URL参数的类为 org.apache.dubbo.common.URL
其中@SP可以指定一个字符串参数,用于指明该SPI的默认实现。
package city.albert; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.Adaptive; import org.apache.dubbo.common.extension.SPI; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2020/8/26 11:08 AM */ @SPI("default") public interface HelloService { /** * 抽象方法 * * @param name * @return */ String sayHello(String name); /** * 抽象方法 * * @param url * @param name * @return */ @Adaptive String sayHello(URL url, String name); }
(2)创建实现类
在Service实现类中实现接口,这里为了区分创建了两个类
package city.albert.impl; import city.albert.HelloService; import org.apache.dubbo.common.URL; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2020/8/26 11:11 AM */ public class DefaultServiceImpl implements HelloService{ @Override public String sayHello(String name) { return "默认输出:你好! "+name; } @Override public String sayHello(URL url, String name) { return "默认输出:你好! "+name; } }
package city.albert.impl; import city.albert.HelloService; import org.apache.dubbo.common.URL; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2020/8/26 11:16 AM */ public class UserServiceImpl implements HelloService { @Override public String sayHello(String name) { return "自定义输出:你好! " + name; } @Override public String sayHello(URL url, String name) { return "自定义输出:你好! " + name; } }