Spring容器的初始化过程

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
ac.register(AppConfig.class);
ac.refresh();

一、容器实例化

public AnnotationConfigApplicationContext() {
    
    //spring对外提供了一个解析器
   this.reader = new AnnotatedBeanDefinitionReader(this);

    //Spring完成自己的扫描并不是使用了这个scanner,而是在扫描的时候自己重新new了一个。
    //这个的作用就是对外提供一个接口,可以让程序员自己调用,完成自己的包扫描
   this.scanner = new ClassPathBeanDefinitionScanner(this);
}

spring为什么要对外提供一个解析器?
1.解析配置类。spring的配置类不能自己扫描自己,因此就需要一个类来完成将配置类解析成为一个AnnotatedGenericBeanDefinition的功能,reader就完成了这个功能。
其他的普通类则是在spring执行包扫描的时候,根据配置类上面的配置的包扫描路径被spring解析成为一个ScannedGenericBeanDefinition.
2.对外提供接口,程序员可以动态的注册beanDefinition.AnnotatedBeanDefinitionReader对外暴露了一个register(),可以让程序员自己注册beanDefinition.
为什么spring不是自己new一个AnnotatedGenericBeanDefinition,将配置类解析成beanDefinition?
1.虽然spring可以自己new一个AnnotatedGenericBeanDefinition完成配置类的解析,但是不利于扩展
2。配置类的个数是不一定的,spring没办法知道到底有几个配置类。因此需要一个解析器去解析所有的配置类

spring在初始化解析器的时候将spring bean生命周期过程中至关重要的5个后置处理器放到了beanDefinitionMap中,为spring完成容器初始化过程打下基础
构造方法调用,最后调用到AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
    //构造方法调用
   this(registry, getOrCreateEnvironment(registry));
}

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
   Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
   Assert.notNull(environment, "Environment must not be null");
   this.registry = registry;
   this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
   AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}


下面看AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)到底完成了什么事情
//这里就指出几个重要的

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
      BeanDefinitionRegistry registry, @Nullable Object source) {

    //bean工厂的初始化
   DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
   if (beanFactory != null) {
      if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
         beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
      }
      if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
         beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
      }
   }

   Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);

    //解析配置类的beanFactoryPostProcessor 最重要的后置处理器
   if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
    
    //解析@Autowired
   if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
    //解析@Resource
   // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
   if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
   }

   // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
   if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition();
      try {
         def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
               AnnotationConfigUtils.class.getClassLoader()));
      }
      catch (ClassNotFoundException ex) {
         throw new IllegalStateException(
               "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
      }
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
   }

   if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
   }

   if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
   }

   return beanDefs;
}

二。配置类的注册 — ac.register(AppConfig.class) 这里就体现了reader 的价值

public void register(Class<?>... componentClasses) {
   Assert.notEmpty(componentClasses, "At least one component class must be specified");
   //从这里可以看出,本质是调用reader的register()
   this.reader.register(componentClasses);
}

层层调用之后的本质代码如下

private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
      @Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
      @Nullable BeanDefinitionCustomizer[] customizers) {

    //这里就可以看出 spring是将@Configuration的配置类解析成了一个AnnotatedGenericBeanDefinition
   AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
   if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
      return;
   }

   abd.setInstanceSupplier(supplier);
   //解析设置bean的Scope
   ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
   abd.setScope(scopeMetadata.getScopeName());
   
   //解析beanName (具体就不再细述,简单的说就是解析这个beanDefinition,根据不同的类型加上不同的后缀)
   String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

    //解析bean上的注解,判断bean是不是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);
   //将解析之后的配置类put到beanDefinitionMap中
   BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

至此spring完成了容器的实例化,bean工厂的初始化,内置beanDefinition和配置类的解析过程(类–>BeanDefinition–>put definitionMap)、解析器和扫描器的初始化

如有理解不正确的地方,欢迎大家指出