当一个接口存在多个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过程。

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