dubbo源码(六)-Activate源码详解

上篇我们简单讲了dubbo activate的使用,同样也是没有什么代码,还是从测试代码开始:

    @Test
    public void testValue() {
        ExtensionLoader extExtensionLoader = ExtensionLoader.getExtensionLoader(ActivateExt.class);
        URL url = URL.valueOf("test://localhost/test");

        /**
         * 对应 @Activate(value = {"myKey"})
         */
        url = url.addParameter("myKey", "test");

        List list = extExtensionLoader.getActivateExtension(url, new String[]{}, "value");
        list.forEach(o -> System.out.println(o.echo(o.getClass().getName())));
    }
  1. 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 getActivateExtension(URL url, String[] values, String group) {
        List exts = new ArrayList();
        // 这一步将 values 从数组转成 list
        List names = values == null ? new ArrayList(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 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 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.isEmpty()) {
                        exts.addAll(0, usrs);
                        usrs.clear();
                    }
                } else {
                    // 通过扩展名,加载扩展添加到结果集
                    T ext = getExtension(name);
                    usrs.add(ext);
                }
            }
        }
        // 添加到激活集合中
        if (!usrs.isEmpty()) {
            exts.addAll(usrs);
        }
        // 返回符合条件的激活扩展
        return exts;
    }

这段代码整体难度不大,很多部分都已经上几篇有讲解

你可能感兴趣的:(dubbo源码(六)-Activate源码详解)