alibaba / spring-context-support

An internal support project for spring-context in Alibaba
Apache License 2.0
150 stars 83 forks source link

Iterator 做无用功 #16

Closed Huangxuny1 closed 4 years ago

Huangxuny1 commented 4 years ago

registerBeans(BeanDefinitionRegistry registry, Class<?>... annotatedClasses) 方法中 本意是移除已经注册过的 annotatedClass

// Remove all annotated-classes that have been registered
Iterator<Class<?>> iterator = new ArrayList<Class<?>>(asList(annotatedClasses)).iterator();
while (iterator.hasNext()) {
    Class<?> annotatedClass = iterator.next();
    if (isPresentBean(registry, annotatedClass)) {
        iterator.remove();
    }
}

但是实际上 Iterator 在做无用功

testRegisterBeans() 中 重复向 registerBeans

image

提示

INFO support.DefaultListableBeanFactory - Overriding bean definition for bean 'annotatedBeanDefinitionRegistryUtilsTest': replacing [Generic bean: class [com.alibaba.spring.util.AnnotatedBeanDefinitionRegistryUtilsTest]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Generic bean: class [com.alibaba.spring.util.AnnotatedBeanDefinitionRegistryUtilsTest]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]

在 debug中 reader.register(annotatedClasses); 仍然注册了重复的bean , Iterator<Class<?>> iterator = new ArrayList<Class<?>>(asList(annotatedClasses)).iterator(); 然后 iterator.remove(); 是无意义的 image

mercyblitz commented 4 years ago

Thanks, it's fixed.