在類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過程。