十二、Spring Boot 嵌入式 Servlet 容器啟動原理
什麼時候建立嵌入式 Servlet 容器工廠? 什麼時候獲取嵌入式 Servlet 容器並啟動服務?
1)、Spring Boot 應用啟動執行 run(); 方法
2)、refreshContext(context); Spring Boot重新整理 IOC 容器(建立 IOC容器物件並初始化,建立容器中的每一個元件),
如果是 WEB 應用
建立的是 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext 容器;
如果不是
建立的是 org.springframework.web.context.ConfigurableWebApplicationContext
3)、refresh(context); 重新整理上一步建立好的 IOC 容器
public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
4)、this.onRefresh(); WEB 的 IOC 容器重寫了 onRefresh() 方法
5)、 WEB 的 IOC 容器會建立 嵌入式的 Servlet 容器
@Override
protected void onRefresh() {
super.onRefresh();
try {
createEmbeddedServletContainer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start embedded container",
ex);
}
}
6)、獲取嵌入式的Servlet容器工廠:
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
private void createEmbeddedServletContainer() {
EmbeddedServletContainer localContainer = this.embeddedServletContainer;
ServletContext localServletContext = getServletContext();
if (localContainer == null && localServletContext == null) {
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
this.embeddedServletContainer = containerFactory
.getEmbeddedServletContainer(getSelfInitializer());
}
else if (localServletContext != null) {
try {
getSelfInitializer().onStartup(localServletContext);
}
catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context",
ex);
}
}
initPropertySources();
}
從 IOC 容器中獲取 EmbeddedServletContainerFactory 元件;此時專案start 裡面有哪個的依賴,就建立對應的物件:XXXXEmbeddedServletContainerFactory,後置處理器起作用,獲取所有的定製器來定製 Servlet 容器的相關配置
7)、使用容器工廠獲取嵌入式的Servlet 容器:
this.embeddedServletContainer = containerFactory.getEmbeddedServletContainer(getSelfInitializer());
private void createEmbeddedServletContainer() {
EmbeddedServletContainer localContainer = this.embeddedServletContainer;
ServletContext localServletContext = getServletContext();
if (localContainer == null && localServletContext == null) {
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
this.embeddedServletContainer = containerFactory
.getEmbeddedServletContainer(getSelfInitializer());
}
else if (localServletContext != null) {
try {
getSelfInitializer().onStartup(localServletContext);
}
catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context",
ex);
}
}
initPropertySources();
}
8)、嵌入式的Servlet容器建立物件並且啟動
Spring Boot是先啟動嵌入式的Servlet容器,再將 IOC 容器中沒有建立的物件獲取出來
IOC容器啟動建立嵌入式Servlet容器
相關文章
- SpringBoot2.4.0中嵌入式servlet容器的自動配置以及啟動原理(自我理解)Spring BootServlet
- Spring容器系列-啟動原理Spring
- Spring 容器與 Servlet互動SpringServlet
- 從servlet容器到Spring mvc 5.1.1.RELEASE IoC 啟動原始碼分析ServletSpringMVC原始碼
- Spring Boot 自動配置原理Spring Boot
- spring-boot啟動Springboot
- Spring Boot啟動流程Spring Boot
- Spring Boot(十二):Spring Boot 如何測試打包部署Spring Boot
- Spring Boot核心原理-自動配置Spring Boot
- Spring Boot 自動裝配原理Spring Boot
- Spring Boot Starters啟動器Spring Boot
- Spring Boot Runner啟動器Spring Boot
- Spring Boot 啟動過程Spring Boot
- Spring Boot自動配置原理、實戰Spring Boot
- Spring Boot啟動流程簡述Spring Boot
- Maven專案Spring Boot啟動MavenSpring Boot
- Spring Boot乾貨系列:(十二)Spring Boot使用單元測試Spring Boot
- Spring Boot 原理<1>Spring Boot
- Spring Boot定製啟動圖案Spring Boot
- [maven][spring boot] mvn spring-boot:run啟動時,指定pom檔案MavenSpring Boot
- Spring Boot自動配置原理與實踐(一)Spring Boot
- Spring Boot自動配置原理與實踐(二)Spring Boot
- spring boot學習(4): 命令列啟動Spring Boot命令列
- Spring Boot原始碼分析-啟動過程Spring Boot原始碼
- Spring Boot 應用程式啟動流程分析Spring Boot
- Spring Boot中用嵌入式PostgreSQL測試Spring BootSQL
- Servlet 規範和 Servlet 容器Servlet
- Spring Boot 內嵌容器 Tomcat / UndertowSpring BootTomcat
- Java SpringBoot 應用使用命令列 mvn spring-boot run 啟動的原理JavaSpring Boot命令列
- Spring boot學習(一)開啟Spring boot之旅Spring Boot
- Spring Boot(三):Spring Boot中的事件的使用 與Spring Boot啟動流程(Event 事件 和 Listeners監聽器)Spring Boot事件
- 在Spring Boot中建立自己的啟動器Spring Boot
- 使用lazyInit縮短Spring Boot啟動時間Spring Boot
- Spring Boot中Tomcat是怎麼啟動的Spring BootTomcat
- Spring Boot 系統啟動任務定義Spring Boot
- 一文了解Spring Boot啟動類SpringApplicationSpring BootAPP
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- spring boot 不連線資料庫啟動Spring Boot資料庫