前言
上面一章介绍了整个项目启动的环境准备工作,接下来就开始进行整个项目的加载。
代码部分:
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事件的钩子函数。
-
prepareRefresh()。- 在上下文环境中初始化任何占位符属性源。
- 验证所有标记为required的属性都是可解析的。
- 刷新前注册的本地监听器。
-
obtainFreshBeanFactory()。
这里面更新了GenericApplicationContext中refreshed标志(这里看不出意义在哪),以及返回BeanFactory。 -
prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)。
配置工厂的标准上下文特征,比如上下文的类加载器和后处理器、SPEL表达式解析器等等。 -
invokeBeanFactoryPostProcessors(beanFactory);。
实例化并调用所有注册的BeanFactoryPostProcessor bean,如果给定则遵循显式顺序。 -
registerBeanPostProcessors(beanFactory);。
注册拦截bean创建的bean处理器,例如熟知的AutowiredAnnotationBeanPostProcessor等。 -
initMessageSource();。
初始化此上下文的消息源(这里默认使用一个空的MessageSource去处理getMessage调用)。 -
initApplicationEventMulticaster();。
初始化ApplicationEventMulticaster。如果上下文中没有定义,则使用SimpleApplicationEventMulticaster,也就是事件监听生产者。 -
onRefresh();。
初始化Tomcat等,同时BeanPostProcessor前置与后置方法处理调用。(因为需要crateBean(tomcat))。 -
registerListeners();。
添加applicationEventMulticaster中ApplicationListener至集合中。 -
finishBeanFactoryInitialization(beanFactory);。
实例化所有剩余的(非lazy-init)单例,例如Aware等实现接口。 -
finishRefresh();。
完成此上下文的刷新,调用LifecycleProcessor的onRefresh()方法并发布ContextRefreshedEvent。 -
resetCommonCaches();。
清除上面创建bean的过程中集合的缓存。 -
registerShutdownHook()。
向JVM注册一个关闭钩子,当JVM关闭通知上下文的关闭。
总结
当前一个方法中包含许多的操作!!!,这里面加载了许多的
BeanProcessors用于创建各种Bean的时候处理,同时也是整个启动过程中最终要的一个步骤。