dubbo扩展点的AOP 通过装饰模式一层层的包装实现aop,最精髓的莫过于instance = injectExtension((T) wrapperClass.getConstructor(ty

从ExtensionLoader的createExtension代码说起
@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;
           
//begin
           
if (wrapperClasses != null && wrapperClasses.size() > 0) {
               
for (Class<?> wrapperClass : wrapperClasses) {
                    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
                }
            }
           
//end
           
return instance;
        }
catch (Throwable t) {
           
throw new IllegalStateException("Extension instance(name: " + name + ", class: " +
                    type +
")  could not be instantiated: " + t.getMessage(), t);
        }
    }

关键说明,
1. cachedWrapperClasses是在loadFile里面加载的,”WrapperClass”是符合某种特征的扩展接口实现类的称呼。例如ProtocolFilterWrapper
和ProtocolListenerWrapper。他们共同特征就是带有Protocol接口的构造函数。
**
* ListenerProtocol
*
* @author william.liangf
*/

public class ProtocolFilterWrapper implements Protocol {

   
private final Protocol protocol;

   
public ProtocolFilterWrapper (Protocol protocol) {
       
if (protocol == null ) {
           
throw new IllegalArgumentException( "protocol == null" );
        }
       
this .protocol = protocol;
    }

   
private static <T> Invoker<T> buildInvokerChain ( final Invoker<T> invoker, String key, String group) {
        Invoker<T> last = invoker;
        List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
       
if (filters.size() > 0 ) {
           
for ( int i = filters.size() - 1 ; i >= 0 ; i--) {
               
final Filter filter = filters.get(i);
               
final Invoker<T> next = last;
                last =
new Invoker<T>() {

                   
public Class<T> getInterface () {
                       
return invoker.getInterface();
                    }

                   
public URL getUrl () {
                       
return invoker.getUrl();
                    }

                   
public boolean isAvailable () {
                       
return invoker.isAvailable();
                    }

                   
public Result invoke (Invocation invocation) throws RpcException {
                       
return filter.invoke(next, invocation);
                    }

                   
public void destroy () {
                        invoker.destroy();
                    }

                   
@Override
                   
public String toString () {
                       
return invoker.toString();
                    }
                };
            }
        }
       
return last;
    }

   
public int getDefaultPort () {
       
return protocol.getDefaultPort();
    }

   
public <T> Exporter<T> export (Invoker<T> invoker) throws RpcException {
       
if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
           
return protocol.export(invoker);
        }
       
return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
    }

   
public <T> Invoker<T> refer (Class<T> type, URL url) throws RpcException {
       
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
           
return protocol.refer(type, url);
        }
       
return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);
    }

   
public void destroy () {
        protocol.destroy();
    }

}
转载自:https://blog.csdn.net/sinat_33994921/article/details/80156352#commentBox
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值