SpringBoot启动流程(3) | 七日打卡

463 阅读2分钟

前言

  上面一章介绍了整个项目启动的环境准备工作,接下来就开始进行整个项目的加载。

代码部分:

org.springframework.boot.SpringApplication#refreshContext中:

refreshContext(context);

org.springframework.context.support.AbstractApplicationContext#refresh中:

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			prepareRefresh();

			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			prepareBeanFactory(beanFactory);

			try {
				postProcessBeanFactory(beanFactory);

				invokeBeanFactoryPostProcessors(beanFactory);

				registerBeanPostProcessors(beanFactory);

				initMessageSource();

				initApplicationEventMulticaster();

				onRefresh();

				registerListeners();

				finishBeanFactoryInitialization(beanFactory);

				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				destroyBeans();

				cancelRefresh(ex);

				throw ex;
			}

			finally {
				resetCommonCaches();
			}
		}
	}

流程讲解

主要查看的是上述第二段的代码,第一段里面执行完第二段之后,也就做了一个Tomcat事件的钩子函数。

  1. prepareRefresh()

    1. 在上下文环境中初始化任何占位符属性源。
    2. 验证所有标记为required的属性都是可解析的。
    3. 刷新前注册的本地监听器。
  2. obtainFreshBeanFactory()
    这里面更新了GenericApplicationContextrefreshed标志(这里看不出意义在哪),以及返回BeanFactory

  3. prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
    配置工厂的标准上下文特征,比如上下文的类加载器和后处理器、SPEL表达式解析器等等。

  4. invokeBeanFactoryPostProcessors(beanFactory);
    实例化并调用所有注册的BeanFactoryPostProcessor bean,如果给定则遵循显式顺序。

  5. registerBeanPostProcessors(beanFactory);
    注册拦截bean创建的bean处理器,例如熟知的AutowiredAnnotationBeanPostProcessor等。

  6. initMessageSource();
    初始化此上下文的消息源(这里默认使用一个空的MessageSource去处理getMessage调用)。

  7. initApplicationEventMulticaster();
    初始化ApplicationEventMulticaster。如果上下文中没有定义,则使用SimpleApplicationEventMulticaster,也就是事件监听生产者。

  8. onRefresh();
    初始化Tomcat等,同时BeanPostProcessor前置与后置方法处理调用。(因为需要crateBean(tomcat))。

  9. registerListeners();
    添加applicationEventMulticasterApplicationListener至集合中。

  10. finishBeanFactoryInitialization(beanFactory);
    实例化所有剩余的(非lazy-init)单例,例如Aware等实现接口。

  11. finishRefresh();
    完成此上下文的刷新,调用LifecycleProcessor的onRefresh()方法并发布ContextRefreshedEvent

  12. resetCommonCaches();
    清除上面创建bean的过程中集合的缓存。

  13. registerShutdownHook()
    JVM注册一个关闭钩子,当JVM关闭通知上下文的关闭。

总结

当前一个方法中包含许多的操作!!!,这里面加载了许多的BeanProcessors用于创建各种Bean的时候处理,同时也是整个启动过程中最终要的一个步骤。