當一個接口存在多個Wrapper時,Dubbo 擴展點生成的過程

在類ServiceConfig中,

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

用於得到一個Protocol的擴展點,由於Protocol有兩個wrapper,分別是ProtocolFilterWrapper、ProtocolListenerWrapper,那麼在存在多個wrapper時,擴展點的生成過程是怎樣的?

處理代碼在類ExtensionLoader中

 @SuppressWarnings("unchecked")
    private T createExtension(String name) {
        Class<?> clazz = getExtensionClasses().get(name);
        if (clazz == null) {
            throw findException(name);
        }
        try {
            T instance = (T) EXTENSION_INSTANCES.get(clazz);
            if (instance == null) {
                EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance());
                instance = (T) EXTENSION_INSTANCES.get(clazz);
            }
            injectExtension(instance);
            Set<Class<?>> wrapperClasses = cachedWrapperClasses;
            if (wrapperClasses != null && wrapperClasses.size() > 0) {
                for (Class<?> wrapperClass : wrapperClasses) {
                    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
                }
            }
            return instance;
        } catch (Throwable t) {
            throw new IllegalStateException("Extension instance(name: " + name + ", class: " +
                    type + ")  could not be instantiated: " + t.getMessage(), t);
        }
    }

本例中,變量wrapperClasses中,就是保存的就是ProtocolFilterWrapper與ProtocolListenerWrapper,由於這個變量的類型是Set型,說明裏面的內容不要求順序,主要看下面這段代碼

         Set<Class<?>> wrapperClasses = cachedWrapperClasses;
            if (wrapperClasses != null && wrapperClasses.size() > 0) {
                for (Class<?> wrapperClass : wrapperClasses) {
                    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
                }
            }
            return instance;

在進入循環之前,instance的值是DubboProtocol的對象,當第一次循環時,當從wrapperClasses中取的值是ProtocolFilterWrapper時,此時instance的值是ProtocolFilterWrapper的對象,第二次循環時,此時instance的值是ProtocolListenerWrapper的對象,最後這個instance返回,包裝的過程如下:

        ProtocolListenerWrapper-->ProtocolFilterWrapper-->DubboProtocol

當然也有可能是

        ProtocolFilterWrapper-->ProtocolListenerWrapper-->-->DubboProtocol

這樣就實現了AOP過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章