Spring中Bean的注册

image.png

利用 AnnotatedBeanDefinitionReader 工具类获取注解注册 Bean

public void register(Class<?>... componentClasses) {  
    Assert.notEmpty(componentClasses, "At least one component class must be specified");  
    StartupStep registerComponentClass = this.getApplicationStartup().start("spring.context.component-classes.register").tag("classes", () -> {  
        return Arrays.toString(componentClasses);  
    });  
    this.reader.register(componentClasses);  
    registerComponentClass.end();  
}

AnnotatedBeanDefinitionReader 会遍历所有传入 componentClasses 的注解类,然后通过 doRegisterBean 方法完成注册。

doRegisterBean 源码:

private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,  
      @Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,  
      @Nullable BeanDefinitionCustomizer[] customizers) {  
  //将配置信息转换为BeanDefinition
   AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);  
   if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {  
      return;  
   }  
  
   abd.setInstanceSupplier(supplier);  
   //获取Bean作用域的元数据解析Bean的作用域
   ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);  
   //将Bean作用域写回
   abd.setScope(scopeMetadata.getScopeName());  
   String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));  
   //@Lazy和@Primary注解的解析
   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));  
         }  
      }  
   }  
   if (customizers != null) {  
      for (BeanDefinitionCustomizer customizer : customizers) {  
         customizer.customize(abd);  
      }  
   }  
  
   BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);  
   definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);  
   BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);  
}
uml diagram