1.1 dubbo源码解析之@Adaptive

代码ExtensionLoader.getExtensionLoader(class).getAdaptiveExtension()判断@Adaptive注解在类上或者方法上的实现是有差异的,当@Adaptive在类上的时候可以看观看之前@SPI讲解中对于AdaptiveExtensionFactory的实现部分。
当@Adaptive在方法上的时候我们可以通过以下代码进行跟进:
ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();

前半部分关于loader的部分直接跳过,进入getAdaptiveExtension()进行跟进

 public T getAdaptiveExtension() {
        Object instance = cachedAdaptiveInstance.get();
        if (instance == null) {
            if (createAdaptiveInstanceError == null) {
                synchronized (cachedAdaptiveInstance) {
                    instance = cachedAdaptiveInstance.get();
                    if (instance == null) {
                        try {
                            instance = createAdaptiveExtension();
                            cachedAdaptiveInstance.set(instance);
                        } catch (Throwable t) {
                            createAdaptiveInstanceError = t;
                            throw new IllegalStateException("fail to create adaptive instance: " + t.toString(), t);
                        }
                    }
                }
            } else {
                throw new IllegalStateException("fail to create adaptive instance: " + createAdaptiveInstanceError.toString(), createAdaptiveInstanceError);
            }
        }

 private T createAdaptiveExtension() {
        try {
            return injectExtension((T) getAdaptiveExtensionClass().newInstance());
        } catch (Exception e) {
            throw new IllegalStateException("Can not create adaptive extension " + type + ", cause: " + e.getMessage(), e);
        }
    }

private Class getAdaptiveExtensionClass() {
        getExtensionClasses();
        if (cachedAdaptiveClass != null) {
            return cachedAdaptiveClass;
        }
        return cachedAdaptiveClass = createAdaptiveExtensionClass();
    }

因为@Adaptive放在了方法上,所以cachedAdaptiveClass == null ,最终代码会执行到createAdaptiveExtensionClass(),然后执行方法createAdaptiveExtensionClassCode()生成一串字符串然后通过调用javassist动态生成代理class

private Class createAdaptiveExtensionClass() {
        String code = createAdaptiveExtensionClassCode();
        ClassLoader classLoader = findClassLoader();
        com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
        return compiler.compile(code, classLoader);
    }

你可能感兴趣的:(1.1 dubbo源码解析之@Adaptive)