Spring 源码(三)注册配置类 BeanDefinition

2019-09-29  本文已影响0人  xiaolyuh

调用链路:

registerBeanDefinition:861, DefaultListableBeanFactory (org.springframework.beans.factory.support)
registerBeanDefinition:315, GenericApplicationContext (org.springframework.context.support)
registerBeanDefinition:149, BeanDefinitionReaderUtils (org.springframework.beans.factory.support)
registerBean:192, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
registerBean:142, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
register:131, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
register:160, AnnotationConfigApplicationContext (org.springframework.context.annotation)
<init>:83, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源码:

public void register(Class<?>... annotatedClasses) {
    for (Class<?> annotatedClass : annotatedClasses) {
        registerBean(annotatedClass);
    }
}

public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
    AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
    if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
        return;
    }

    ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
    abd.setScope(scopeMetadata.getScopeName());
    String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
    AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
    if (qualifiers != null) {
        for (Class<? extends Annotation> qualifier : qualifiers) {
            if (Primary.class == qualifier) {
                abd.setPrimary(true);
            }
            else if (Lazy.class == qualifier) {
                abd.setLazyInit(true);
            }
            else {
                abd.addQualifier(new AutowireCandidateQualifier(qualifier));
            }
        }
    }
    // 注册配置类
    BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
    definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
    BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
  1. 先获取所有的配置类
  2. 循环调用registerBean方法
  3. 通过 BeanDefinitionRegistry 将配置类的BeanDefinition 注册到容器
上一篇 下一篇

猜你喜欢

热点阅读