在类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过程。