Spring
源码 - 容器刷新#onRefresh()
Spring
版本:Spring 5.3.13-release
# 1、onRefresh()
onRefresh()
方法是Spring
预留给子类, 用于初始化其他的Bean
用的。
Spring
中AbstractApplicationContext#onRefresh()
的是没有做任何事情的:
protected void onRefresh() throws BeansException {
// For subclasses: do nothing by default.
}
而在Spring Boot
中ServletWebServerApplicationContext#onRefresh()
是有重写这个方法的:
@Override
protected void onRefresh() {
// 调用 GenericWebApplicationContext 初始化主题功能
super.onRefresh();
try {
// 启动 Spring Boot 的嵌入式 Tomcat 服务器
createWebServer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
其中super.onRefresh()
为GenericWebApplicationContext#onRefresh()
:
@Override
protected void onRefresh() {
this.themeSource = UiApplicationContextUtils.initThemeSource(this);
}
这一步是初始化主题功能。
其中createWebServer()
会启动Spring Boot
的嵌入式Tomcat
服务器。ServletWebServerApplicationContext#createWebServer()
代码:
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
if (webServer == null && servletContext == null) {
StartupStep createWebServer = this.getApplicationStartup().start("spring.boot.webserver.create");
// 获取 webServer 工厂类, 因为 webServer 的提供者有多个 : JettyServletWebServerFactory、TomcatServletWebServerFactory、UndertowServletWebServerFactory
ServletWebServerFactory factory = getWebServerFactory();
createWebServer.tag("factory", factory.getClass().toString());
// 通过 webServer 工厂获取 webServer 并将其赋值给当前容器内的 webServer。同时还会启动 Tomcat 服务器
this.webServer = factory.getWebServer(getSelfInitializer());
createWebServer.end();
getBeanFactory().registerSingleton("webServerGracefulShutdown",
new WebServerGracefulShutdownLifecycle(this.webServer));
getBeanFactory().registerSingleton("webServerStartStop",
new WebServerStartStopLifecycle(this, this.webServer));
}
else if (servletContext != null) {
try {
getSelfInitializer().onStartup(servletContext);
}
catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化资源
initPropertySources();
}
我这里的
Spring Boot
源码版本为:2.6.2-release
GitHub源码地址:https://github.com/kapbc/kapcb-spring-source/tree/master/Spring-Framework-v5.3.13
备注:此文为笔者学习
Spring
源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。