美文网首页
dubbo源码(六)-Activate源码详解

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

作者: KissGoodby | 来源:发表于2019-02-14 10:57 被阅读0次

    上篇我们简单讲了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())));
        }
    
    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<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;
        }
    

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

    相关文章

      网友评论

          本文标题:dubbo源码(六)-Activate源码详解

          本文链接:https://www.haomeiwen.com/subject/cdbseqtx.html