/*** This is equivalent to
* getActivateExtension(url, key, null);
*
* 在所有的激活中,要使用key 指定的扩展
*@paramurl url
*@paramkey url parameter key which used to get extension point names
*@returnextension list which are activated.
*@see#getActivateExtension(com.alibaba.dubbo.common.URL, String, String)*/
public ListgetActivateExtension(URL url, String key)/*** This is equivalent to
* getActivateExtension(url, url.getParameter(key).split(","), null);
*
* 在所有的激活中,要指定的group 外加 使用key 指定的扩展
*@paramurl url
*@paramkey url parameter key which used to get extension point names
*@paramgroup group
*@returnextension list which are activated.
*@see#getActivateExtension(com.alibaba.dubbo.common.URL, String[], String)*/
public ListgetActivateExtension(URL url, String key, String group)/*** This is equivalent to
* getActivateExtension(url, values, null);
*
* 在所有的激活中 values指定的扩展
*@paramurl url
*@paramvalues extension point names
*@returnextension list which are activated
*@see#getActivateExtension(com.alibaba.dubbo.common.URL, String[], String)*/
public ListgetActivateExtension(URL url, String[] values)//最后其实都有下面方法实现
/*** Get activate extensions.
* 加载active扩展
*@paramurl url
*@paramvalues extension point names
*@paramgroup group
*@returnextension list which are activated
*@seecom.alibaba.dubbo.common.extension.Activate*/
public ListgetActivateExtension(URL url, String[] values, String group) {
List exts = new ArrayList();
List names = values == null ? new ArrayList(0) : Arrays.asList(values);if (!names.contains(Constants.REMOVE_VALUE_PREFIX +Constants.DEFAULT_KEY)) {
getExtensionClasses();//cachedActivates里放的map结构 接口实现扩展名:其上的Activate对象
for (Map.Entry entry : cachedActivates.entrySet()) {//遍历所有Activate注解对象
String name = entry.getKey();//spi 扩展名
Activate activate =entry.getValue();if (isMatchGroup(group, activate.group())) {//如果有group匹配
T ext = getExtension(name);//加在扩展类//name不在 values 指定之列,并且没排除name,并且activate的value 在url有对应参数,就算激活
if (!names.contains(name)&& !names.contains(Constants.REMOVE_VALUE_PREFIX +name)&&isActive(activate, url)) {//exts.add(ext);
}
}
}//排序Activate 具体实现在ActivateComparator里,实现了Comparator 接口compare方法
Collections.sort(exts, ActivateComparator.COMPARATOR);
}
List usrs = new ArrayList();for (int i = 0; i < names.size(); i++) {
String name=names.get(i);if (!name.startsWith(Constants.REMOVE_VALUE_PREFIX)&& !names.contains(Constants.REMOVE_VALUE_PREFIX +name)) {//遍历所有没有排除的扩展名
if(Constants.DEFAULT_KEY.equals(name)) {if (usrs.size() > 0) {
exts.addAll(0, usrs);
usrs.clear();
}
}else{//通过扩展名,加载扩展添加到结果集
T ext =getExtension(name);
usrs.add(ext);
}
}
}if (usrs.size() > 0) {
exts.addAll(usrs);
}//返回符合条件的激活扩展
returnexts;
}