我们都知道BeanFactory 仅提供bean的配置信息加载和创建工作,ApplicationContext 可以理解为是BeanFactory的扩展,ApplicationContext包含了BeanFactory的所有功能,并且对BeanFactory提供了一些企业级的扩展。
AbstractApplicationContext.refresh()方法,是整个ApplicationContext的入口方法,就从这个方法开始探究ApplicationContext容器是怎么刷新的。

  1. public void refresh() throws BeansException, IllegalStateException {
  2. synchronized (this.startupShutdownMonitor) {
  3. /**
  4. * 初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。
  5. * 在某种情况下项目的使用需要读取某些系统变量, 而这个变量的设置很可能会影响着系统的正确性
  6. * 那么ClassPathXmlApplicationContext为我们提供的这个准备函数就显得非常必要
  7. * 它可以在Spring启动的时候提前对必需的变量进行存在性验证。
  8. */
  9. prepareRefresh();
  10. // Tell the subclass to refresh the internal bean factory.
  11. // 初始化BeanFactory,并进行XML文件读取。
  12. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  13. // Prepare the bean factory for use in this context.
  14. // 对BeanFactory进行各种功能填充。
  15. // @Qualifier与@Autowired这两个注解正是在这一步骤中增加的支持。
  16. prepareBeanFactory(beanFactory);
  17. try {
  18. // Allows post-processing of the bean factory in context subclasses.
  19. /**
  20. * 子类覆盖方法做额外的处理。
  21. * 空的函数实现postProcessBeanFactory来方便程序员在业务上做进一步扩展。
  22. */
  23. postProcessBeanFactory(beanFactory);
  24. // 激活各种BeanFactoryPostProcessor后置处理器。(典型的有MyBatis的MapperScannerConfigurer)
  25. invokeBeanFactoryPostProcessors(beanFactory);
  26. // 注册BeanPostProcessor,这里只是注册,真正的调用是在getBean时候
  27. // 注册的定义就是将BeanPostProcessor实例交给BeanFactory管理,放在BeanFactory对象的map属性中
  28. registerBeanPostProcessors(beanFactory);
  29. // 为上下文初始化Message资源,即对不同语言的消息体进行国际化处理
  30. initMessageSource();
  31. // 初始化事件广播器,广播器的作用是用来存放监听器并在合适的时候调用监听器
  32. initApplicationEventMulticaster();
  33. // 空方法,留给子类实现
  34. onRefresh();
  35. // 在所有注册的bean中查找listener bean,注册到消息广播器中。
  36. registerListeners();
  37. // 初始化剩下的单实例(非惰性的)
  38. finishBeanFactoryInitialization(beanFactory);
  39. // Last step: publish corresponding event.
  40. finishRefresh();
  41. }
  42. catch (BeansException ex) {
  43. if (logger.isWarnEnabled()) {
  44. logger.warn("Exception encountered during context initialization - " +
  45. "cancelling refresh attempt: " + ex);
  46. }
  47. // Destroy already created singletons to avoid dangling resources.
  48. destroyBeans();
  49. // Reset 'active' flag.
  50. cancelRefresh(ex);
  51. // Propagate exception to caller.
  52. throw ex;
  53. }
  54. finally {
  55. // Reset common introspection caches in Spring's core, since we
  56. // might not ever need metadata for singleton beans anymore...
  57. resetCommonCaches();
  58. }
  59. }
  60. }

1. 初始化前准备工作

在容器刷新前的一些初始化准备工作,例如:对系统属性和环境变量的校验工作。

  1. protected void prepareRefresh() {
  2. // Switch to active.
  3. this.startupDate = System.currentTimeMillis();
  4. this.closed.set(false);
  5. this.active.set(true);
  6. if (logger.isInfoEnabled()) {
  7. logger.info("Refreshing " + this);
  8. }
  9. // 一个空方法,留给子类实现
  10. initPropertySources();
  11. // 验证需要的属性是否已经放入环境中
  12. getEnvironment().validateRequiredProperties();
  13. // Store pre-refresh ApplicationListeners...
  14. if (this.earlyApplicationListeners == null) {
  15. this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
  16. }
  17. else {
  18. // Reset local application listeners to pre-refresh state.
  19. this.applicationListeners.clear();
  20. this.applicationListeners.addAll(this.earlyApplicationListeners);
  21. }
  22. // Allow for the collection of early ApplicationEvents,
  23. // to be published once the multicaster is available...
  24. this.earlyApplicationEvents = new LinkedHashSet<>();
  25. }

2. 加载BeanFatory

我们知道ApplicationContext容器是具有BeanFactory的功能的,就是在这里实现创建的BeanFactory,创建完后ApplicationContext就真正的具有BeanFactory的功能了。

  1. protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
  2. // 由子类实现这个方法
  3. // 初始化BeanFactory,并读取XML文件,将BeanFactory对象属性放到当前容器中
  4. // 这里要注意,如果是SpringBoot,子类实现这个方法时,不会加载XML文件,因为加载工作已经在这之前已经被执行
  5. refreshBeanFactory();
  6. // 返回ApplicationContext中的beanFactory对象
  7. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  8. if (logger.isDebugEnabled()) {
  9. logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
  10. }
  11. return beanFactory;
  12. }

SpringBoot 的ApplicationContext容器实现refreshBeanFactory()方法的片段,是没有去创建beanFactory和加载配置的。这里我们有个了解就行,不做详述。我们的重点是分析非SpringBoot的ApplicationContext 实现refreshBeanFactory()方法

  1. protected final void refreshBeanFactory() throws IllegalStateException {
  2. if (!this.refreshed.compareAndSet(false, true)) {
  3. throw new IllegalStateException(
  4. "GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
  5. }
  6. this.beanFactory.setSerializationId(getId());
  7. }

2.1. 创建BeanFactory

在这里会创建DefaultListableBeanFactory对象,它是BeanFactory的实现。读取XML文件进行解析,对BeanFactory的相关属性赋值

  1. protected final void refreshBeanFactory() throws BeansException {
  2. if (hasBeanFactory()) {
  3. destroyBeans();
  4. closeBeanFactory();
  5. }
  6. try {
  7. // 创建BeanFactory对象
  8. DefaultListableBeanFactory beanFactory = createBeanFactory();
  9. // 设置序列号
  10. beanFactory.setSerializationId(getId());
  11. // 定制BeanFactory对象属性
  12. // 其实就是设置allowBeanDefinitionOverriding和allowCircularReferences 属性
  13. // allowBeanDefinitionOverriding 允许覆盖已经同名bean的实例标识
  14. // allowCircularReferences 允许解决循环依赖标识
  15. customizeBeanFactory(beanFactory);
  16. // 从XML加载bean的配置
  17. loadBeanDefinitions(beanFactory);
  18. this.beanFactory = beanFactory;
  19. }
  20. catch (IOException ex) {
  21. throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
  22. }
  23. }

2.1.1. 定制BeanFactory属性

这里只是设置了BeanFactory 工厂对象是否允许覆盖同名的bean和循环依赖

  1. protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
  2. // 允许覆盖同名的bean
  3. // false 不允许,true 允许
  4. if (this.allowBeanDefinitionOverriding != null) {
  5. beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
  6. }
  7. // 允许解决循环依赖
  8. // false 不允许,true 允许
  9. if (this.allowCircularReferences != null) {
  10. beanFactory.setAllowCircularReferences(this.allowCircularReferences);
  11. }
  12. }

2.1.2. 加载BeanDefinition

通过创建XmlBeanDefinitionReader对象,调用它的loadBeanDefinitions 信息,将bean配置信息转换为BeanDefinition对象,因为XmlBeanDefinitionReader 对象中具有BeanFactory,所以最终会把bean的beanDefinition交给BeanFactory

  1. protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
  2. // 为BeanFactory工程对象创建XmlBeanDefinitionReader对象
  3. XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
  4. beanDefinitionReader.setEnvironment(this.getEnvironment());
  5. beanDefinitionReader.setResourceLoader(this);
  6. beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
  7. initBeanDefinitionReader(beanDefinitionReader);
  8. // 加载bean配置信息
  9. loadBeanDefinitions(beanDefinitionReader);
  10. }

3. 准备BeanFactory

前面我们已经创建了BeanFactory对象,并且赋值给了ApplicationContext容器中的beanFactory属性。说明容器已经具备了BeanFactory对象,接下来需要对容器中的BeanFactory对象做一些准备工作

  1. protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  2. // 设置BeanFactory的classLoader为当前ApplicationContext的classLoader
  3. beanFactory.setBeanClassLoader(getClassLoader());
  4. // 为beanFactory中添加表达式语言处理器
  5. // 处理如:#{bean.xxx}的表达式
  6. beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
  7. // 为beanFactory中添加propertyEditor
  8. // 这是一个对bean的属性管理的一个工具类
  9. // 还可以实现PropertyEditorRegistry 接口,自定义属性管理器然后注册到beanFactory中,具体这里不做详述
  10. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
  11. // 为beanFactory添加一个ApplicationContextAwareProcessor后置处理器
  12. // 这个后置处理器的作用是在执行bean的初始化方法之前,检查bean是否为Aware类型,如果是先执行Aware对应的方法
  13. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
  14. // 设置几个需要忽略自动装配的接口,这些接口不会被自动装配
  15. beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
  16. beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
  17. beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
  18. beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
  19. beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
  20. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
  21. // 设置几个自动装配的特殊处理规则
  22. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
  23. beanFactory.registerResolvableDependency(ResourceLoader.class, this);
  24. beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
  25. beanFactory.registerResolvableDependency(ApplicationContext.class, this);
  26. // 为beanFactory中添加一个ApplicationListenerDetector后置处理器
  27. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
  28. // 设置对AspectJ的支持
  29. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  30. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  31. // Set a temporary ClassLoader for type matching.
  32. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  33. }
  34. // 注册几个默认的bean
  35. // 这些bean作为单实例bean放入IOC容器中
  36. // 直接通过getBean(name)的方式就可以获取这些bean
  37. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
  38. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
  39. }
  40. if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
  41. beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
  42. }
  43. if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
  44. beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
  45. }
  46. }

4. 处理BeanFactory

这是一个空方法,留给子类实现的。在准备完BeanFactory工厂后,所有bean已经加载但还没实例化前,修改一些BeanDefinition。

  1. protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  2. }

5. 注册、激活BeanFactoryPostProcessor

BeanFactoryPostProcessor和BeanPostProcessor 基本类似,只是执行时机不同。BeanFactoryPostProcessor执行时机是在实例化bean前执行(典型有MyBatis的整合,通过MapperScannerConfigurer类来扫描MyBatis的接口和配置)。而BeanPostProcessor执行时机是在创建bean的实例阶段,在Bean的实例创建前后和bean的初始化方法前后做一些扩展。我们知道Spring之所以强大为程序员所追捧,是因为他的扩展性开放性。而PostProcessor就是实现扩展性和开放性的最好体现,程序员只需要实现接口来扩展自己的业务。

  1. protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  2. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
  3. // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
  4. // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
  5. if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  6. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  7. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  8. }
  9. }

BeanFactoryPostProcessor的注册和激活最终交给PostProcessorRegistrationDelegate来处理。BeanFactoryPostProcessor 后置处理器分为普通的BeanFactoryPostProcessor 后置处理器和BeanDefinitionRegistryPostProcessor 类型的后置处理器。这两个后置处理器的区别在于BeanDefinitionRegistryPostProcessor 多了一个postProcessBeanDefinitionRegistry()后置处理器方法。所以我们在执行后置处理器时,先执行BeanDefinitionRegistryPostProcessor类型postProcessBeanDefinitionRegistry()后置处理器方法,再执行postProcessBeanFactory()共有的后置处理器方法
注册、激活方法的逻辑:

  1. 先执行类型是BeanDefinitionRegistryPostProcessor 类型,且是硬编码的的后置处理器postProcessBeanDefinitionRegistry() 后置处理器方法
  2. 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
  3. 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自postProcessBeanDefinitionRegistry() 后置处理器方法
  4. 执行没有实现PriorityOrdered接口和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
  5. 执行类型是BeanDefinitionRegistryPostProcessor 类型后置处理器的postProcessBeanFactory()后置处理器方法
  6. 执行类型是BeanFactoryPostProcessor类型的后置处理器,按照实现了PriorityOrdered和Ordered 接口的顺序先后执行postProcessBeanFactory() 后置处理器方法,最后再执行没有实现排序接口postProcessBeanFactory() 后置处理器方法。并排除BeanDefinitionRegistryPostProcessor类型,因为这个类型在之前已经执行过。

    1. public static void invokeBeanFactoryPostProcessors(
    2. ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    3. // 记录被invoke激活过postProcessBeanDefinitionRegistry()方法的BeanFactoryPostProcessor 后置处理器bean名称
    4. Set<String> processedBeans = new HashSet<>();
    5. if (beanFactory instanceof BeanDefinitionRegistry) {
    6. BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
    7. // 常规的BeanFactoryPostProcessor 后置处理器
    8. List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
    9. // 记录BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器
    10. List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    11. // 处理硬编码注册的后置处理器
    12. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
    13. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
    14. // 处理BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器,这类后置处理器比普通后置处理器多了一个postProcessBeanDefinitionRegistry()后置处理器方法
    15. BeanDefinitionRegistryPostProcessor registryProcessor =
    16. (BeanDefinitionRegistryPostProcessor) postProcessor;
    17. // 执行BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器的特殊方法,既:postProcessBeanDefinitionRegistry()
    18. registryProcessor.postProcessBeanDefinitionRegistry(registry);
    19. // 记录BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器
    20. registryProcessors.add(registryProcessor);
    21. }
    22. else {
    23. // 记录硬编码注册的常规后置处理器
    24. regularPostProcessors.add(postProcessor);
    25. }
    26. }
    27. // 通过配置注册的BeanDefinitionRegistryPosProcessor
    28. List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    29. // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
    30. // 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器
    31. // 处理实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器
    32. String[] postProcessorNames =
    33. beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    34. for (String ppName : postProcessorNames) {
    35. // 实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器
    36. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    37. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    38. processedBeans.add(ppName);
    39. }
    40. }
    41. // 对实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序
    42. sortPostProcessors(currentRegistryProcessors, beanFactory);
    43. // 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
    44. registryProcessors.addAll(currentRegistryProcessors);
    45. // 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
    46. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    47. currentRegistryProcessors.clear();
    48. // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
    49. // 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器
    50. // 处理实现了Ordered 接口的BeanDefinitionRegistryPostProcessor后置处理器
    51. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    52. for (String ppName : postProcessorNames) {
    53. // 实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器
    54. if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
    55. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    56. processedBeans.add(ppName);
    57. }
    58. }
    59. // 对实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序
    60. sortPostProcessors(currentRegistryProcessors, beanFactory);
    61. // 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
    62. registryProcessors.addAll(currentRegistryProcessors);
    63. // 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
    64. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    65. currentRegistryProcessors.clear();
    66. // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
    67. // 最后执行没有实现PriorityOrdered和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器(常规的BeanDefinitionRegistryPostProcessor后置处理器)
    68. boolean reiterate = true;
    69. while (reiterate) {
    70. reiterate = false;
    71. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    72. for (String ppName : postProcessorNames) {
    73. if (!processedBeans.contains(ppName)) {
    74. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    75. processedBeans.add(ppName);
    76. reiterate = true;
    77. }
    78. }
    79. // 对常规的BeanDefinitionRegistryPostProcessor后置处理器进行排序
    80. sortPostProcessors(currentRegistryProcessors, beanFactory);
    81. // 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
    82. registryProcessors.addAll(currentRegistryProcessors);
    83. // 执行常规的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
    84. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    85. currentRegistryProcessors.clear();
    86. }
    87. // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
    88. // 激活类型是BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanFactory()方法
    89. invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
    90. // 激活硬编码注册的常规后置处理器BenFactoryPostProcessor后置处理器
    91. // 常规的意思是指不是BeanDefinitionRegistryPostProcessor类型的后置处理器,但是BeanFactoryPostProcess类型的后置处理器
    92. invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    93. }
    94. else {
    95. // 执行上下文中注册的工厂处理器
    96. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    97. }
    98. // 获取所有BeanFactoryPostProcessor 类型的后置处理器名称
    99. String[] postProcessorNames =
    100. beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    101. // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
    102. // Ordered, and the rest.
    103. // 对BeanFactoryPostProcessor 后置处理器按照优先级分类
    104. // 实现PriorityOrdered接口的后置处理器
    105. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    106. // 实现了Ordered接口的后置处理器的bean名称
    107. List<String> orderedPostProcessorNames = new ArrayList<>();
    108. // 存放常规的没有实现排序接口(PriorityOrdered和Ordered接口)的后置处理器的bean名称
    109. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    110. for (String ppName : postProcessorNames) {
    111. if (processedBeans.contains(ppName)) {
    112. // 如果bean已经处理过,不再处理
    113. // skip - already processed in first phase above
    114. }
    115. else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    116. // 实现了PriorityOrdered 接口的BeanFactoryPostProcessor 后置处理器
    117. priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
    118. }
    119. else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    120. // 实现了Ordered 接口的BeanFactoryPostProcessor 后置处理器bean名称
    121. orderedPostProcessorNames.add(ppName);
    122. }
    123. else {
    124. // 没有实现排序的BeanFactoryPostProcessor 后置处理器bean名称
    125. nonOrderedPostProcessorNames.add(ppName);
    126. }
    127. }
    128. // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    129. // 对实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器进行排序
    130. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    131. // 激活实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
    132. invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    133. // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    134. // 获取实现了Ordered接口的BeanFactoryPostProcessor 后置处理器
    135. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
    136. for (String postProcessorName : orderedPostProcessorNames) {
    137. orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    138. }
    139. // 对实现了Ordered接口的BeanFactoryPostProcessor 后置处理器排序
    140. sortPostProcessors(orderedPostProcessors, beanFactory);
    141. // 激活实现了Ordered接口的BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
    142. invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    143. // Finally, invoke all other BeanFactoryPostProcessors.
    144. // 没有实现PriorityOrdered和Ordered接口的BeanFactoryPostProcessor 后置处理器
    145. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    146. for (String postProcessorName : nonOrderedPostProcessorNames) {
    147. nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    148. }
    149. // 激活BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
    150. invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    151. // Clear cached merged bean definitions since the post-processors might have
    152. // modified the original metadata, e.g. replacing placeholders in values...
    153. beanFactory.clearMetadataCache();
    154. }

    6. 注册BeanPostProcessor

    我们知道在getBean()的时,实例化bean和初始化bean前后会执行一些后置处理器,那么这些后置处理器是从哪里来的呢?就是在这一步时把所有关于getBean()时所需的后置处理器注册到beanFactory中。在这里不会执行后置处理器,只会把后置处理器加入到beanFactory的属性中,具体的后置处理器执行会在getBean()的时候执行

    1. protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    2. PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
    3. }

    BeanPostProcessor后置处理器注册进beanFactory,具体是由PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法来实现

    1. public static void registerBeanPostProcessors(
    2. ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    3. // 获取注册的BeanPostProcessor后置处理器名称
    4. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    5. // 整个容器中的后置处理器数量
    6. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    7. // 添加一个打印后置处理器是否全部正常注册成功的后置处理器
    8. // 如果被注册的后置处理器的数量少于整个容器中后置处理器的数量,就打印出信息
    9. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    10. // Ordered, and the rest.
    11. // 存放实现了PriorityOrdered接口的BeanPostProcessor
    12. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    13. // 存放MergedBeanDefinitionPostProcessor 类型的后置处理器
    14. // MergedBeanDefinitionPostProcessor也是继承BeanPostProcessor接口,具有BeanPostProcessor功能
    15. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    16. // 存放实现了Ordered接口的BeanPostProcessor
    17. List<String> orderedPostProcessorNames = new ArrayList<>();
    18. // 存放没有实现PriorityOrdered和Ordered排序接口的BeanPostProcessor,注册时不用保证顺序
    19. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    20. for (String ppName : postProcessorNames) {
    21. // 实现了PriorityOrdered接口的后置处理器
    22. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    23. // 获取后置处理器bean
    24. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    25. // 将实现了PriorityOrdered接口的后置处理器加入到对应集合,在后续统一注册进BeanFactory中
    26. priorityOrderedPostProcessors.add(pp);
    27. // 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
    28. if (pp instanceof MergedBeanDefinitionPostProcessor) {
    29. internalPostProcessors.add(pp);
    30. }
    31. }
    32. else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    33. // 将实现了Ordered接口的BeanPostProcessor后置处理器加入到对应集合,在后续统一注册进BeanFactory中
    34. orderedPostProcessorNames.add(ppName);
    35. }
    36. else {
    37. // 没有实现PriorityOrdered和Ordered接口的后置处理器加入对应集合,在后续统一注册进BeanFactory中
    38. nonOrderedPostProcessorNames.add(ppName);
    39. }
    40. }
    41. // 首先对实现了PriorityOrdered接口的BeanPostProcessor后置处理器排序
    42. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    43. // 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
    44. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    45. // 下一步,注册实现了Ordered接口的BeanPostProcessor后置处理器
    46. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
    47. for (String ppName : orderedPostProcessorNames) {
    48. // 获取后置处理器对象
    49. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    50. orderedPostProcessors.add(pp);
    51. // 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
    52. if (pp instanceof MergedBeanDefinitionPostProcessor) {
    53. internalPostProcessors.add(pp);
    54. }
    55. }
    56. // 对实现了Ordered的BeanPostProcessor后置处理器排序
    57. sortPostProcessors(orderedPostProcessors, beanFactory);
    58. // 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
    59. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
    60. // Now, register all regular BeanPostProcessors.
    61. // 注册将没有实现PriorityOrdered和Ordered接口的BeanPostProcessor后置处理器
    62. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    63. for (String ppName : nonOrderedPostProcessorNames) {
    64. // 获取后置处理器对象
    65. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    66. // 不用保证有序的后置处理器
    67. nonOrderedPostProcessors.add(pp);
    68. // 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
    69. if (pp instanceof MergedBeanDefinitionPostProcessor) {
    70. internalPostProcessors.add(pp);
    71. }
    72. }
    73. // 注册剩余没有实现PriorityOrdered和Ordered接口的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
    74. // 因为是没有实现排序接口的后置处理器,所以不用保证有序就可以直接注册
    75. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    76. // 最后,将对是MergedBeanDefinitionPostProcessor类型的后置处理器排序
    77. sortPostProcessors(internalPostProcessors, beanFactory);
    78. // 注册类型是MergedBeanDefinitionPostProcessor 类型的后置处理器
    79. registerBeanPostProcessors(beanFactory, internalPostProcessors);
    80. // 添加ApplicationListener 探测器
    81. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    82. }

7. 初始化消息资源

为ApplicationContext初始化消息资源,消息资源可以对不同的消息进行国际化。这个方法的逻辑很简单,如果有自定义消息资源管理器就使用自定义的,没有就使用默认的消息资源管理器

  1. protected void initMessageSource() {
  2. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  3. // 如果配置了messageSource就使用配置的
  4. if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
  5. // 创建自定义配置的消息资源bean
  6. // 将自定义配置的messageSource对象记录在messageSource变量中
  7. this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
  8. // Make MessageSource aware of parent MessageSource.
  9. if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
  10. HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
  11. if (hms.getParentMessageSource() == null) {
  12. // Only set parent context as parent MessageSource if no parent MessageSource
  13. // registered already.
  14. hms.setParentMessageSource(getInternalParentMessageSource());
  15. }
  16. }
  17. if (logger.isDebugEnabled()) {
  18. logger.debug("Using MessageSource [" + this.messageSource + "]");
  19. }
  20. }
  21. else {
  22. // 没有配置messageSource,就使用默认的
  23. // Use empty MessageSource to be able to accept getMessage calls.
  24. DelegatingMessageSource dms = new DelegatingMessageSource();
  25. dms.setParentMessageSource(getInternalParentMessageSource());
  26. this.messageSource = dms;
  27. // 将默认的messageSource注册到单实例bean中
  28. beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
  29. if (logger.isDebugEnabled()) {
  30. logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
  31. "': using default [" + this.messageSource + "]");
  32. }
  33. }
  34. }

8. 初始化事件广播器

Spring中为我们提供了事件监听功能,事件的发布都是通过事件广播器来发布的,将事件发布出去,事件监听器就能够监听到事件。事件广播器如果可能在这之前就已经创建,比如启动SpringBoot启动时,会提前创建事件广播器。如果已经创建就使用已经创建的事件广播器,没有就使用默认的事件广播器。

  1. protected void initApplicationEventMulticaster() {
  2. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  3. // 监听器存在,直接从beanFactory中获取
  4. if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
  5. this.applicationEventMulticaster =
  6. beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
  7. if (logger.isDebugEnabled()) {
  8. logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
  9. }
  10. }
  11. else {
  12. // 监听器不存在,注册一个SimpleApplicationEventMulticaster类型的监听器到IOC容器中
  13. // 注册的意思就是将实例对象作为一个单实例bean放到singletonObjects缓存中
  14. this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
  15. beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
  16. if (logger.isDebugEnabled()) {
  17. logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
  18. APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
  19. "': using default [" + this.applicationEventMulticaster + "]");
  20. }
  21. }
  22. }

8.1. 默认事件广播器

SimpleApplicationEventMulticaster 作为默认的事件广播器,里面存放了所有的事件监听器,通过事件广播器发布事件时,会循环调用在事件广播器中的所有监听器

  1. @Override
  2. public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
  3. ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
  4. // 遍历监听器,分别执行invokeListener()方法
  5. for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
  6. Executor executor = getTaskExecutor();
  7. // 如果有线程任务,异步执行,最终会执行到监听器的onApplicationEvent()方法
  8. if (executor != null) {
  9. // 单独起一个线程,异步执行
  10. executor.execute(() -> invokeListener(listener, event));
  11. }
  12. else {
  13. // 没有线程任务,同步执行监听器的onApplicationEvent()方法
  14. invokeListener(listener, event);
  15. }
  16. }
  17. }

9. 注册监听器

前面我们已经创建了事件广播器,那么这里将会把监听器添加到事件广播器中。如有有早期需要广播的事件,会将早期事件通过事件广播器广播出去。
在通过事件广播器发布事件时,这些被添加到的事件监听器将会监听到事件。这其实就是典型的观察者模式。

  1. protected void registerListeners() {
  2. // 硬编码的方式注册事件监听器
  3. for (ApplicationListener<?> listener : getApplicationListeners()) {
  4. getApplicationEventMulticaster().addApplicationListener(listener);
  5. }
  6. // 通过配置文件注册的监听器处理
  7. String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
  8. for (String listenerBeanName : listenerBeanNames) {
  9. getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  10. }
  11. // 早期事件
  12. Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
  13. this.earlyApplicationEvents = null;
  14. // 如果有早期事件需要广播,通过事件广播器将事件发布
  15. if (earlyEventsToProcess != null) {
  16. // 循环所有早期事件,通过事件广播器将事件广播出去
  17. // 那些被匹配到的事件监听器将监听到事件
  18. for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
  19. getApplicationEventMulticaster().multicastEvent(earlyEvent);
  20. }
  21. }
  22. }

10. 创建非延时加载的单例bean

将beanFactory中还没有被创建的单实例bean,进行创建。

  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  2. // 为ApplicationContext添加转换器服务
  3. // 如果容器中存在bean名字为:conversionService的bean,同时类型又是ConversionService.class类型
  4. // 就说明配置了ConverterService,将其添加到beanFactory的conversionService属性中
  5. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
  6. beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
  7. beanFactory.setConversionService(
  8. beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
  9. }
  10. // Register a default embedded value resolver if no bean post-processor
  11. // (such as a PropertyPlaceholderConfigurer bean) registered any before:
  12. // at this point, primarily for resolution in annotation attribute values.
  13. if (!beanFactory.hasEmbeddedValueResolver()) {
  14. beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
  15. }
  16. // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
  17. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  18. for (String weaverAwareName : weaverAwareNames) {
  19. getBean(weaverAwareName);
  20. }
  21. // Stop using the temporary ClassLoader for type matching.
  22. beanFactory.setTempClassLoader(null);
  23. // 冻结所有bean的定义
  24. // 说明在这一步之后,bean的BeanDefinition信息将不能被修改
  25. beanFactory.freezeConfiguration();
  26. // 创建剩余所有还没有被创建的bean
  27. beanFactory.preInstantiateSingletons();
  28. }

10.1. 创建剩余bean

ApplicationContext 的实现默认就是在启动时将所有的非延时加载的bean进行创建,而非等到用到该bean时才创建。这么做的好处就是如果bean的创建存在一些问题,在项目启动时就能够发现,而不是等到项目部署以后,用到某个bean时在创建才发现问题,有时某些bean并不是马上就会用到,可能好几天后才能用到。
在前面的几个步骤我们已经创建了一些bean,接下来就是把那些还没有被创建的bean创建出来。

  1. public void preInstantiateSingletons() throws BeansException {
  2. if (logger.isDebugEnabled()) {
  3. logger.debug("Pre-instantiating singletons in " + this);
  4. }
  5. // 被定义的beanName集合
  6. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
  7. // 遍历beanName,创建bean
  8. for (String beanName : beanNames) {
  9. // 根据beanName 获取bean的定义信息
  10. RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
  11. // 校验bean的定义信息
  12. // 只创建非抽象类,是单实例bean,非延迟创建的bean
  13. if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
  14. // 创建FactoryBean类型的bean
  15. if (isFactoryBean(beanName)) {
  16. Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
  17. if (bean instanceof FactoryBean) {
  18. FactoryBean<?> factory = (FactoryBean<?>) bean;
  19. boolean isEagerInit;
  20. if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
  21. isEagerInit = AccessController.doPrivileged(
  22. (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
  23. getAccessControlContext());
  24. }
  25. else {
  26. isEagerInit = (factory instanceof SmartFactoryBean &&
  27. ((SmartFactoryBean<?>) factory).isEagerInit());
  28. }
  29. if (isEagerInit) {
  30. getBean(beanName);
  31. }
  32. }
  33. }
  34. else {
  35. // 创建非FatoryBean类型的bean
  36. getBean(beanName);
  37. }
  38. }
  39. }
  40. // Trigger post-initialization callback for all applicable beans...
  41. // 至此,我们已经创建好了所有的非延时加载的bean
  42. // 这里将会对SmartInitializingSingleton 类型的bean,执行它的回调方法
  43. for (String beanName : beanNames) {
  44. Object singletonInstance = getSingleton(beanName);
  45. if (singletonInstance instanceof SmartInitializingSingleton) {
  46. SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
  47. // 安全检查的bean
  48. if (System.getSecurityManager() != null) {
  49. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  50. smartSingleton.afterSingletonsInstantiated();
  51. return null;
  52. }, getAccessControlContext());
  53. }
  54. else {
  55. // 执行回调方法
  56. smartSingleton.afterSingletonsInstantiated();
  57. }
  58. }
  59. }
  60. }

11. 完成刷新

在Spring的ApplicationContext 创建完成,所有的非延迟加载的单实例bean被创建后,Spring为我们提供了LifeCycle 接口,通过实现这个接口,在最后会调用LifeCycle接口的start()方法,并在Spring关闭时调用LifeCycle的stop()方法。我们可以实现这个接口来扩展一些功能,如:启动一个后台允许的线程,轮询的收集一些允许信息等

  1. protected void finishRefresh() {
  2. // 清除上下文中的resourceCaches缓存
  3. clearResourceCaches();
  4. // 初始化LifeCycle 处理器
  5. // 启动LifeCycle接口的方法是通过这个处理器来启动
  6. initLifecycleProcessor();
  7. // 通过Lifecycle处理器启动LifeCycle 接口的start()
  8. getLifecycleProcessor().onRefresh();
  9. // Publish the final event.
  10. publishEvent(new ContextRefreshedEvent(this));
  11. // Participate in LiveBeansView MBean, if active.
  12. LiveBeansView.registerApplicationContext(this);
  13. }

11.1. 初始化LifeCycleProcessor

创建LifeCycleProcessor处理器,如果有自定义的处理器就创建自定义处理器,没有使用默认的处理器

  1. protected void initLifecycleProcessor() {
  2. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  3. // 如果LifeCycleProcessor已经创建,或者已经定义了处理器的名称:lifecycleProcessor
  4. // 那么通过getBean()获取处理器对象
  5. if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
  6. this.lifecycleProcessor =
  7. beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
  8. if (logger.isTraceEnabled()) {
  9. logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
  10. }
  11. }
  12. else {
  13. // 还没有定义LifeCycleProcessor处理器的名称
  14. // 创建一个默认的处理器,并注册到beanFactory中作为一个单实例bean
  15. DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
  16. defaultProcessor.setBeanFactory(beanFactory);
  17. this.lifecycleProcessor = defaultProcessor;
  18. beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
  19. if (logger.isTraceEnabled()) {
  20. logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +
  21. "[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");
  22. }
  23. }
  24. }

11.2. 启动start()

通过LifeCycle处理器,执行所有实现LifeCycle接口类的start()方法

  1. public void onRefresh() {
  2. // 执行start()
  3. startBeans(true);
  4. // LifeCycle 接口运行中标识
  5. this.running = true;
  6. }

交给startBeans()方法处理

  1. private void startBeans(boolean autoStartupOnly) {
  2. // 从beanFactory获取已经被创建的LifeCycle 的bean
  3. Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
  4. Map<Integer, LifecycleGroup> phases = new HashMap<>();
  5. // 遍历所有LifeCycle bean
  6. lifecycleBeans.forEach((beanName, bean) -> {
  7. // 只允许非自启动和bean是SmartLifeCycle类型,且是自动启动
  8. if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
  9. // 如果实现了Phased接口,根据Phase 分组,如果没有默认组是0
  10. // 将需LifeCycle bean放到各自的组LifeCycleGroup中的members属性中
  11. // 标识这个组中有哪些LifeCycle bean
  12. int phase = getPhase(bean);
  13. LifecycleGroup group = phases.get(phase);
  14. if (group == null) {
  15. // 新建一个组,用于存放本组需要执行的LifeCycle成员
  16. group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
  17. // 把新建的组放到map中,key为组名称int类型,value 组对象
  18. phases.put(phase, group);
  19. }
  20. // 往组中添加LifeCycle成员
  21. group.add(beanName, bean);
  22. }
  23. });
  24. if (!phases.isEmpty()) {
  25. List<Integer> keys = new ArrayList<>(phases.keySet());
  26. Collections.sort(keys);
  27. // 遍历所有的组
  28. for (Integer key : keys) {
  29. // 执行组里所有成员的start()
  30. phases.get(key).start();
  31. }
  32. }
  33. }

11.2.1. 获取LifeCycle对象

从beanFactory中获取已经加载的LIfeCycle接口的实现对象

  1. protected Map<String, Lifecycle> getLifecycleBeans() {
  2. // 当前ApplicationContext中的beanFactory
  3. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  4. // 存放LifeCycle bean,key为beanName,value为LifeCycle对象
  5. Map<String, Lifecycle> beans = new LinkedHashMap<>();
  6. // 获取所有已经被创建的LifeCycle类型的beanName
  7. String[] beanNames = beanFactory.getBeanNamesForType(Lifecycle.class, false, false);
  8. // 遍历所有LifeCycle的beanName
  9. for (String beanName : beanNames) {
  10. // 如果beanName中第一个字符是&,去掉&字符
  11. String beanNameToRegister = BeanFactoryUtils.transformedBeanName(beanName);
  12. // 校验是不是实现了FactoryBean,也就是说是不是FactoryBean类型的bean
  13. boolean isFactoryBean = beanFactory.isFactoryBean(beanNameToRegister);
  14. // 识别beanName
  15. // 如果是FactoryBean类型的bean,获取它的原始bean,需要在beanName前加&字符,否则不用处理beanName
  16. String beanNameToCheck = (isFactoryBean ? BeanFactory.FACTORY_BEAN_PREFIX + beanName : beanName);
  17. // 条件一
  18. // 单实例bean中有beanName是beanNameToRegister 名称的bean
  19. // 并且不是FactoryBean类型,或者根据beanNameToCheck名称能匹配到LifeCycle类型的bean
  20. // 条件二
  21. // 是SmartLifecycle 类型的bean
  22. // 满足其中一个条件即可
  23. if ((beanFactory.containsSingleton(beanNameToRegister) &&
  24. (!isFactoryBean || matchesBeanType(Lifecycle.class, beanNameToCheck, beanFactory))) ||
  25. matchesBeanType(SmartLifecycle.class, beanNameToCheck, beanFactory)) {
  26. // 获取bean的原始实例
  27. // 为什么说是原始实例,是因为如果bean是FactoryBean类型的,通过beanName获取到的是getObject()方法的对象,而不是这个对象本身
  28. // 如果想要获得原始实例,需要在beanName前加&字符
  29. // 非BeanFactory类型的bean,根据beanName就能获取到实例本身
  30. Object bean = beanFactory.getBean(beanNameToCheck);
  31. if (bean != this && bean instanceof Lifecycle) {
  32. // 放到map集合中
  33. beans.put(beanNameToRegister, (Lifecycle) bean);
  34. }
  35. }
  36. }
  37. return beans;
  38. }

11.2.2. 执行start()

LifecycleGroup 中执行本组中所有LifeCycle成员的start()

  1. public void start() {
  2. if (this.members.isEmpty()) {
  3. return;
  4. }
  5. if (logger.isInfoEnabled()) {
  6. logger.info("Starting beans in phase " + this.phase);
  7. }
  8. Collections.sort(this.members);
  9. for (LifecycleGroupMember member : this.members) {
  10. doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
  11. }
  12. }

11.3. 发布事件

启动完LifeCycle接口的start()方法后,紧接着发布一个ContextRefreshedEvent 事件

  1. protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
  2. Assert.notNull(event, "Event must not be null");
  3. if (logger.isTraceEnabled()) {
  4. logger.trace("Publishing event in " + getDisplayName() + ": " + event);
  5. }
  6. // 如果有需要,将事件对象转换为ApplicationEvent
  7. ApplicationEvent applicationEvent;
  8. if (event instanceof ApplicationEvent) {
  9. applicationEvent = (ApplicationEvent) event;
  10. }
  11. else {
  12. // 非ApplicationEvent类型的事件,装饰为PayloadApplicationEvent 对象
  13. applicationEvent = new PayloadApplicationEvent<>(this, event);
  14. if (eventType == null) {
  15. eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
  16. }
  17. }
  18. // 早期事件,在注册监听器的时候,会广播事件
  19. if (this.earlyApplicationEvents != null) {
  20. this.earlyApplicationEvents.add(applicationEvent);
  21. }
  22. else {
  23. // 广播事件
  24. getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
  25. }
  26. // Publish event via parent context as well...
  27. if (this.parent != null) {
  28. if (this.parent instanceof AbstractApplicationContext) {
  29. ((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
  30. }
  31. else {
  32. this.parent.publishEvent(event);
  33. }
  34. }
  35. }