文档:http://dubbo.apache.org/zh-cn/docs/dev/SPI.html
subscribe:订阅
本地注册:我注册的接口和实现类
dubbo:有三个概念
URL:统一资源定位器(简单理解为总线) dubbo中服务,注册中心,消费者,配置信息。。。都是资源
Invoke:可执行体 提供方:用于调用服务提供类 消费方:用于执行远程调用
Invocation:调用对象(封装接口名,方法名,形列表。。。。)
ExtensionLoader<Car> extensionLoader =
ExtensionLoader.getExtensionLoader(Car.class);
EXTENSION_LOADERS:放入(接口,ExtensionLoader)
getExtensionClasses()---Map
cachedDefaultName:默认的类名
DUBBO_INTERNAL_DIRECTORY = META-INF/dubbo/internal/
DUBBO_DIRECTORY = META-INF/dubbo/
SERVICES_DIRECTORY = META-INF/services/
从一直调用到getExtension()---->loadClass()方法
injectExtension(instance);
Set<Class<?>> wrapperClasses = cachedWrapperClasses; //缓存包装类
if (CollectionUtils.isNotEmpty(wrapperClasses)) {
for (Class<?> wrapperClass : wrapperClasses) {
instance = injectExtension((T)wrapperClass.getConstructor(type).newInstance(instance));
}
}
调用包装类,像递归一层一层调用 并更改值wrapperClass.getConstructor(type).newInstance(instance)
public T getAdaptiveExtension() {
Object instance = cachedAdaptiveInstance.get();
if (instance == null) {
if (createAdaptiveInstanceError == null) {
synchronized (cachedAdaptiveInstance) {
instance = cachedAdaptiveInstance.get();
if (instance == null) {
try {
instance = createAdaptiveExtension(); //自适应,代理类(实现了接口),从url中取值
使用自动注入时:dubbo生成接口的代理类,然后通过url找到实现类,—————>包装类------>执行