通常,我们所说的spring启动过程,就是IOC容器初始化流程,也就是创建ApplicationContext对象以及调用refresh()方法的过程,下面以AnnotationConfigApplicationContext为例子,来介绍spring启动原理。

1、构造方法前:

在调用AnnotationConfigApplicationContext构造方法之前,会调用它的父类GenericApplicationContext的构造方法,该构造方法会生成一个beanFactory:DefaultListableBeanFactory()。

2、构造方法:

调用AnnotationConfigApplicationContext构造方法,包含三个步骤:

2.1 调用this()

① 生成AnnotatedBeanDefinationReader,对beanFactory进行设置和添加postProcessor。

  1. - 设置dependencyComparatorAnnotationAwareOrderComparator,它是一个Comparator,是用来进行排序的,会获取某个对象上的**Order注解**或者通过实现**Ordered接口**所定义的值进行排序,在日常开发中可以利用这个类来进行排序。
  2. - 设置autowireCandidateResolverContextAnnotationAutowireCandidateResolver,用来解析某个Bean能不能进行自动注入,比如某个BeanautowireCandidate属性是否等于true
  3. - BeanFactory中添加**ConfigurationClassPostProcessor**对应的BeanDefinition,它是一个BeanDefinitionRegistryPostProcessor,并且实现了PriorityOrdered接口
  4. - BeanFactory中添加**AutowiredAnnotationBeanPostProcessor**对应的BeanDefinition,它是一个InstantiationAwareBeanPostProcessorAdapterMergedBeanDefinitionPostProcessor
  5. - BeanFactory中添加CommonAnnotationBeanPostProcessor对应的BeanDefinition,它是一个InstantiationAwareBeanPostProcessorInitDestroyAnnotationBeanPostProcessor
  6. - BeanFactory中添加EventListenerMethodProcessor对应的BeanDefinition,它是一个BeanFactoryPostProcessorSmartInitializingSingleton
  7. - BeanFactory中添加DefaultEventListenerFactory对应的BeanDefinition,它是一个EventListenerFactory

② 构造ClassPathBeanDefinationScanner(主要作用是扫描并得到beanDefination)。

  1. - 设置**this.includeFilters = AnnotationTypeFilter(Component.class)**
  2. - 设置environment
  3. - 设置resourceLoader

2.2 调用register(componentClasses)

  1. 利用上一步生成的reader,注册配置类为BeanDefinition,类型为AnnotatedGenericBeanDefinition

2.3 调用refresh()方法

① prepareRefresh():

  1. - 记录启用时间
  2. - 设置Environment属性,并且验证是否包括了必须属性。

② obtainFreshBeanFactory()

  1. - 进行BeanFactoryrefresh,在这里会去调用子类的refreshBeanFactory方法,具体子类是怎么刷新的得看子类,然后再调用子类的getBeanFactory方法,重新得到一个BeanFactory

③ prepareBeanFactory(beanFactory)

  1. 1. 设置beanFactory的类加载器
  2. 1. 设置表达式解析器:StandardBeanExpressionResolver,用来解析Spring中的表达式
  3. 1. 添加PropertyEditorRegistrarResourceEditorRegistrarPropertyEditor类型转化器注册器,用来注册一些默认的PropertyEditor
  4. 1. 添加一个Bean的后置处理器:ApplicationContextAwareProcessor,是一个BeanPostProcessor,用来执行EnvironmentAwareApplicationEventPublisherAware等回调方法
  5. 1. 添加**ignoredDependencyInterface**:可以向这个属性中添加一些接口,如果某个类实现了这个接口,并且这个类中的某些set方法在接口中也存在,那么这个set方法在自动注入的时候是不会执行的,比如EnvironmentAware这个接口,如果某个类实现了这个接口,那么就必须实现它的setEnvironment方法,而这是一个set方法,和Spring中的autowire是冲突的,那么Spring在自动注入时是不会调用setEnvironment方法的,而是等到回调Aware接口时再来调用(注意,这个功能仅限于xmlautowire@Autowired注解是忽略这个属性的)
  6. 1. EnvironmentAware
  7. 1. EmbeddedValueResolverAware
  8. 1. ResourceLoaderAware
  9. 1. ApplicationEventPublisherAware
  10. 1. MessageSourceAware
  11. 1. ApplicationContextAware
  12. 1. 另外其实在构造BeanFactory的时候就已经提前添加了另外三个:
  13. 1. BeanNameAware
  14. 1. BeanClassLoaderAware
  15. 1. BeanFactoryAware
  16. 6. 添加**resolvableDependencies**:在byType进行依赖注入时,会先从这个属性中根据类型找bean
  17. 1. BeanFactory.class:当前BeanFactory对象
  18. 1. ResourceLoader.class:当前ApplicationContext对象
  19. 1. ApplicationEventPublisher.class:当前ApplicationContext对象
  20. 1. ApplicationContext.class:当前ApplicationContext对象
  21. 7. 添加一个Bean的后置处理器:ApplicationListenerDetector,是一个BeanPostProcessor,用来判断某个Bean是不是ApplicationListener,如果是则把这个Bean添加到ApplicationContext中去,注意一个ApplicationListener只能是单例的
  22. 7. 添加一个Bean的后置处理器:LoadTimeWeaverAwareProcessor,是一个BeanPostProcessor,用来判断某个Bean是不是实现了LoadTimeWeaverAware接口,如果实现了则把ApplicationContext中的loadTimeWeaver回调setLoadTimeWeaver方法设置给该Bean
  23. 7. 添加一些单例bean到单例池:
  24. 1. "environment"Environment对象
  25. 1. "systemProperties"System.getProperties()返回的Map对象
  26. 1. "systemEnvironment"System.getenv()返回的Map对象

④ postProcessBeanFactory(beanFactory)

  1. - 提供给AbstractApplicationContext的子类进行扩展,具体的子类,可以继续向BeanFactory中再添加一些东西

⑤ invokeBeanFactoryPostProcessors(beanFactory)
执行BeanFactoryPostProcessor

  1. 1. 此时在BeanFactory中会存在一个BeanFactoryPostProcessor:**ConfigurationClassPostProcessor**,它也是一个**BeanDefinitionRegistryPostProcessor**
  2. 1. **第一阶段**
  3. 1. BeanFactory中找到类型为BeanDefinitionRegistryPostProcessorbeanName,也就是**ConfigurationClassPostProcessor**, 然后调用BeanFactorygetBean方法得到实例对象
  4. 1. 执行**ConfigurationClassPostProcessorpostProcessBeanDefinitionRegistry()**方法:
  5. 1. 解析AppConfig
  6. 1. 扫描得到BeanDefinition并注册
  7. 1. 解析@Import@Bean等注解得到BeanDefinition并注册
  8. 1. 在这里,我们只需要知道在这一步会去得到BeanDefinition,而这些BeanDefinition中可能存在BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor,所以执行完ConfigurationClassPostProcessorpostProcessBeanDefinitionRegistry()方法后,还需要继续执行其他BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry()方法
  9. 5. 执行其他BeanDefinitionRegistryPostProcessor的**postProcessBeanDefinitionRegistry()**方法
  10. 5. 执行所有BeanDefinitionRegistryPostProcessor的**postProcessBeanFactory()**方法
  11. 5. **第二阶段**
  12. 5. BeanFactory中找到类型为BeanFactoryPostProcessorbeanName,而这些BeanFactoryPostProcessor包括了上面的BeanDefinitionRegistryPostProcessor
  13. 5. 执行还没有执行过的BeanFactoryPostProcessor的**postProcessBeanFactory()**方法

到此,所有的BeanFactoryPostProcessor的逻辑都执行完了,主要做的事情就是得到BeanDefinition并注册到BeanFactory中
⑥ registerBeanPostProcessors(beanFactory)

  1. - 因为上面的步骤完成了扫描,这个过程中程序员可能自己定义了一些BeanPostProcessor,在这一步就会把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去(属性**beanPostProcessors**),最后再重新添加一个ApplicationListenerDetector对象(之前其实就添加了过,这里是为了把ApplicationListenerDetector移动到最后)

⑦ initMessageSource()

  1. - 如果BeanFactory中存在一个叫做"**messageSource**"BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContextmessageSource属性,让ApplicationContext拥有**国际化**的功能

⑧ initApplicationEventMulticaster()

  1. - 如果BeanFactory中存在一个叫做"**applicationEventMulticaster**"BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContextapplicationEventMulticaster属性,让ApplicationContext拥有**事件发布**的功能

⑨ onRefresh()

  1. - 提供给AbstractApplicationContext的子类进行扩展,这里暂时没用

⑩ registerListeners()

  1. - BeanFactory中获取ApplicationListener类型的beanName,然后添加到ApplicationContext中的事件广播器**applicationEventMulticaster**中去,到这一步因为FactoryBean还没有调用getObject()方法生成Bean对象,所以这里要在根据类型找一下ApplicationListener,记录一下对应的beanName

11 finishBeanFactoryInitialization(beanFactory)

  1. - 完成BeanFactory的初始化,主要就是**实例化非懒加载的单例Bean**,这一步非常重要,bean的生命周期的很多关键步骤都在这里。我们会有单独的章节来讲解bean的生命周期。

12 finishRefresh()

  1. - Spring启动的最后一步
  2. - 设置ApplicationContextlifecycleProcessor,默认情况下设置的是DefaultLifecycleProcessor
  3. - 调用lifecycleProcessoronRefresh()方法,如果是DefaultLifecycleProcessor,那么会获取所有类型为LifecycleBean对象,然后调用它的start()方法,这就是ApplicationContext的生命周期扩展机制
  4. - 发布ContextRefreshedEvent事件。