@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);
}
}
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接口的构造函数。
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();
}
}
* 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