Dubbo高级进阶Spi应用以及与JDK的Spi区别

Dubbo监控平台DubboAdmin安装监控

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

相关文章: