上篇我們簡單講了dubbo activate的使用罩旋,同樣也是沒有什么代碼佣赖,還是從測試代碼開始:
@Test
public void testValue() {
ExtensionLoader<ActivateExt> extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
URL url = URL.valueOf("test://localhost/test");
/**
* 對應(yīng) @Activate(value = {"myKey"})
*/
url = url.addParameter("myKey", "test");
List<ActivateExt> list = extExtensionLoader.getActivateExtension(url, new String[]{}, "value");
list.forEach(o -> System.out.println(o.echo(o.getClass().getName())));
}
-
ExtensionLoader.getExtensionLoader
已經(jīng)講解過钞瀑,現(xiàn)在我們直接看getActivateExtension
方法,代碼如下:
/**
* Get activate extensions.
*
* @param url url
* @param values extension point names
* @param group group
* @return extension list which are activated
* @see org.apache.dubbo.common.extension.Activate
*/
public List<T> getActivateExtension(URL url, String[] values, String group) {
List<T> exts = new ArrayList<T>();
// 這一步將 values 從數(shù)組轉(zhuǎn)成 list
List<String> names = values == null ? new ArrayList<String>(0) : Arrays.asList(values);睦疫、
// 判斷 names 是否包含 -default
if (!names.contains(Constants.REMOVE_VALUE_PREFIX + Constants.DEFAULT_KEY)) {
// 通過 SPI 獲取所有的拓展類
// 在這一步莹菱,會判斷類上有 Activate 注解,如果有緩存到 cachedActivates 中文捶,key為擴展點實現(xiàn)類名稱荷逞,value為Activate實例
getExtensionClasses();
// 遍歷 cachedActivates
for (Map.Entry<String, Object> entry : cachedActivates.entrySet()) {
// SPI 擴展點實現(xiàn)類名稱
String name = entry.getKey();
// activate實例
Object activate = entry.getValue();
// 定義 group 和 value
String[] activateGroup, activateValue;
// 賦值
if (activate instanceof Activate) {
activateGroup = ((Activate) activate).group();
activateValue = ((Activate) activate).value();
} else if (activate instanceof com.alibaba.dubbo.common.extension.Activate) {
activateGroup = ((com.alibaba.dubbo.common.extension.Activate) activate).group();
activateValue = ((com.alibaba.dubbo.common.extension.Activate) activate).value();
} else {
continue;
}
// 進行g(shù)roup匹配
if (isMatchGroup(group, activateGroup)) {
// 如果匹配成功,直接根據(jù) SPI 擴展點實現(xiàn)類名稱獲取實現(xiàn)類
T ext = getExtension(name);
// name不在 values 指定之列粹排,并且沒排除name种远,并且activate的value 在url有對應(yīng)參數(shù),就算激活
if (!names.contains(name) // name不在 values 指定之列
&& !names.contains(Constants.REMOVE_VALUE_PREFIX + name)
&& isActive(activateValue, url)) { // 并且activate的value 在url有對應(yīng)參數(shù)
// 激活
exts.add(ext);
}
}
}
//排序Activate
Collections.sort(exts, ActivateComparator.COMPARATOR);
}
List<T> usrs = new ArrayList<T>();
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.isEmpty()) {
exts.addAll(0, usrs);
usrs.clear();
}
} else {
// 通過擴展名顽耳,加載擴展添加到結(jié)果集
T ext = getExtension(name);
usrs.add(ext);
}
}
}
// 添加到激活集合中
if (!usrs.isEmpty()) {
exts.addAll(usrs);
}
// 返回符合條件的激活擴展
return exts;
}
這段代碼整體難度不大坠敷,很多部分都已經(jīng)上幾篇有講解