上篇我们简单讲了dubbo activate的使用,同样也是没有什么代码,还是从测试代码开始:
@Test
public void testValue() {
ExtensionLoader<ActivateExt> extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
URL url = URL.valueOf("test://localhost/test");
/**
* 对应 @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
已经讲解过,现在我们直接看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 从数组转成 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为扩展点实现类名称,value为Activate实例
getExtensionClasses();
// 遍历 cachedActivates
for (Map.Entry<String, Object> entry : cachedActivates.entrySet()) {
// SPI 扩展点实现类名称
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;
}
// 进行group匹配
if (isMatchGroup(group, activateGroup)) {
// 如果匹配成功,直接根据 SPI 扩展点实现类名称获取实现类
T ext = getExtension(name);
// name不在 values 指定之列,并且没排除name,并且activate的value 在url有对应参数,就算激活
if (!names.contains(name) // name不在 values 指定之列
&& !names.contains(Constants.REMOVE_VALUE_PREFIX + name)
&& isActive(activateValue, url)) { // 并且activate的value 在url有对应参数
// 激活
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 {
// 通过扩展名,加载扩展添加到结果集
T ext = getExtension(name);
usrs.add(ext);
}
}
}
// 添加到激活集合中
if (!usrs.isEmpty()) {
exts.addAll(usrs);
}
// 返回符合条件的激活扩展
return exts;
}
这段代码整体难度不大,很多部分都已经上几篇有讲解
网友评论