Dubbo
中可以通过SPI
机制来加载对应扩展点实现,可是一个扩展点对应着多个实现类,我们如何才能触发目标实现类中的方法呢?Dubbo
的Adaptive
机制就是解决这个问题的。
下面我们用代码来看一下@Adaptive注解的使用方式以及源码实现。
- 扩展点接口
ICarService
package com.dubbo.service;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.Adaptive;
import org.apache.dubbo.common.extension.SPI;
@SPI
public interface ICarService {
void speed(URL url);
}
- 两个扩展点实现类
AudiService
、BMWService
package com.dubbo.service.impl;
import com.dubbo.service.ICarService;
import org.apache.dubbo.common.URL;
// 实现类 奥迪
public class AudiService implements ICarService {
@Override
public void speed(URL url) {
System.out.println("audi drive speed 100KM/H");
}
}
// 实现类 宝马
public class BMWService implements ICarService {
@Override
public void speed(URL url) {
System.out.println("bmw drive speed 200KM/H");
}
}
- 扩展点配置文件
META-INF/services/com.lbb.service.ICarService
audi=com.lbb.service.impl.AudiService
bmw=com.lbb.service.impl.BMWService
一、类上添加@Adaptive
注解
我们可以在类上添加@Adaptive
注解来标示该类为当前扩展点的代理类,在代理类的方法中会根据传入参数从而自行选择实现类来进行调用。下面我们用具体的代码来实现一个代理类:
- 首先创建一个Adaptive类,集成扩展点接口
package com.lbb.adaptive;
import com.lbb.service.ICarService;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.Adaptive;