需要将Spring源码整体看明白首先要看明白一个方法 refresh()
。
这个方法位于 AbstractApplicationContext
类中。这个类里面包含了13个方法,这13个方法就是整个Spring核心的处理流程。
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
/**
* 前戏,做容器刷新前的准备工作
* 1. 设置容器的启动时间
* 2. 设置活跃状态为true
* 3. 设置关闭状态为false
* 4. 获取Environment对象,并加载当前系统的属性值到Environment对象中去
* 5. 准备监听器和事件的集合对象,默认为空的集合
*/
this.prepareRefresh();
// 创建容器对象:DefaultListableBeanFactory
// 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
// beanFactory的准备工作,对各种属性进行填充
this.prepareBeanFactory(beanFactory);
try {
// 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码是有具体实现的
this.postProcessBeanFactory(beanFactory);
// 调用各种beanFactory处理器
this.invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean处理器,这里只是注册功能,真正调用的是getBean方法
this.registerBeanPostProcessors(beanFactory);
// 为上下文初始化message源,即不同语言的消息体,国际化处理,
this.initMessageSource();
// 初始化事件监听器多路广播器
this.initApplicationEventMulticaster();
// 留给子类来初始化其他的bean
this.onRefresh();
// 在所有注册的bean中查找listener bean,注册到消息广播器中
this.registerListeners();
// 实例化剩下的单实例(非懒加载的)
this.finishBeanFactoryInitialization(beanFactory);
// 完成属性过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
// 为防止bean资源占用,在异常处理中,销毁已经在前面过程中生成的单件bean
this.destroyBeans();
// 重置active标志
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
}
prepareRefresh()
: 前期容器最基本的准备工作obtainFreshBeanFactory()
: 创建出当前的容器对象,并解析xml文件和注解
还有另一个方法protected final void refreshBeanFactory() throws BeansException { if (this.hasBeanFactory()) { this.destroyBeans(); this.closeBeanFactory(); } try { // 创建容器 其实就是return new DefaultListableBeanFactory() DefaultListableBeanFactory beanFactory = this.createBeanFactory(); beanFactory.setSerializationId(this.getId()); this.customizeBeanFactory(beanFactory); // 解析xml和注解,对BeanDefinition进行封装。BeanDefinition:所有xml配置和注解最终都会被读取到这个对象中去。 this.loadBeanDefinitions(beanFactory); synchronized(this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException var5) { throw new ApplicationContextException("I/O error parsing bean definition source for " + this.getDisplayName(), var5); } }
prepareBeanFactory()
: beanFactory的准备工作,上一步只是new 了一个BeanFactory,没有对属性进行赋值,而在这一步对beanFactory进行属性赋值。postProcessBeanFactory()
:空方法,空方法意味着给子类进行扩展实现。invokeBeanFactoryPostProcessors()
: 执行BeanFactoryPostProcessor
registerBeanPostProcessors()
:initMessageSource()
: 进行国际化配置的,不是很重要initApplicationEventMulticaster()
: 观察者模式,广播器onRefresh()
: 空方法,留给子类扩展使用。SpringBoot内嵌tomcat就是在这里实现的。
springBoot中ServletWebServerApplicationContext
对该方法进行了重写protected void onRefresh() { super.onRefresh(); try { // 此处创建了tomcat this.createWebServer(); } catch (Throwable var2) { throw new ApplicationContextException("Unable to start web server", var2); } } private void createWebServer() { WebServer webServer = this.webServer; ServletContext servletContext = this.getServletContext(); if (webServer == null && servletContext == null) { StartupStep createWebServer = this.getApplicationStartup().start("spring.boot.webserver.create"); // 在这里获取到了 TomcatServletWebServerFactory ServletWebServerFactory factory = this.getWebServerFactory(); createWebServer.tag("factory", factory.getClass().toString()); this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()}); createWebServer.end(); this.getBeanFactory().registerSingleton("webServerGracefulShutdown", new WebServerGracefulShutdownLifecycle(this.webServer)); this.getBeanFactory().registerSingleton("webServerStartStop", new WebServerStartStopLifecycle(this, this.webServer)); } else if (servletContext != null) { try { this.getSelfInitializer().onStartup(servletContext); } catch (ServletException var5) { throw new ApplicationContextException("Cannot initialize servlet context", var5); } } this.initPropertySources(); }
registerListeners()
: 监听器,与上面的广播器是配套的。用来监听广播的事件。在原生的Spring中这个用的不多,在SpringBoot中使用较多finishBeanFactoryInitialization()
: 实例化剩下的单实例(非懒加载的)。也就是在此处完成Bean的生命周期,bean对象的创建工作。finishRefresh()
: 进行一些扫尾工作resetCommonCaches()
: 清空缓存