美文网首页
Spring经典函数收集:递归调用

Spring经典函数收集:递归调用

作者: 码而优则仕 | 来源:发表于2020-05-11 20:01 被阅读0次

    Spring经典函数收集:递归调用

    protected boolean isDependent(String beanName, String dependentBeanName) {
            synchronized (this.dependentBeanMap) {
                return isDependent(beanName, dependentBeanName, null);
            }
        }
    
        // A-[1,2,3,4],1->[a,b,c,d],2->[q,w,r]....
        //第一次调用 检查A->[1,2,3,4]
        //第一次,一层检查没有循环依赖,则检查 A依赖的每个 bean的依赖集合
        //循环,递归 1->[a,b,c,d] 直到全部检查完毕
        //alreadySeen 存放已经检查过的和当前 bean不循环依赖的bean集合
        private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) {
            if (alreadySeen != null && alreadySeen.contains(beanName)) {
                return false;
            }
            //处理多重别名
            String canonicalName = canonicalName(beanName);
            //获取当前bean依赖的所有bean名称集合
            Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
            if (dependentBeans == null) {
                return false;
            }
            //当前bean 依赖的bean中包含当前bean就是循环依赖
            if (dependentBeans.contains(dependentBeanName)) {
                return true;
            }
            //循环检查当前 bean依赖的 bean集合中的每个 bean依赖的bean集合 是否和当前bean循环依赖
            for (String transitiveDependency : dependentBeans) {
                if (alreadySeen == null) {
                    alreadySeen = new HashSet<>();
                }
                alreadySeen.add(beanName);
                //递归调用检查循环依赖
                if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
                    return true;
                }
            }
            return false;
        }
    
    

    相关文章

      网友评论

          本文标题:Spring经典函数收集:递归调用

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