外部 Servlet 容器启动|学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习外部 Servlet 容器启动

开发者学堂课程【SpringBoot快速掌握 - 核心技术外部 Servlet  容器启动】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/612/detail/9264


外部 Servlet  容器启动


内容介绍

一、原理

核心

 

一、原理

Jar包:执行  SpringBoot 主类的 main 方法,启动  IOC  容器,创建  Servlet  容器;

War包:启动服务器,服务器启动 SpringBoot  应用【SpringBootServletnitializer】,启动  ioc  容器;

servlet3.0 ( Spring  注解版)︰

8.2.4 Shared libraries / runtimes pluggability :

1.规则∶

1 )服务器启动(  web 应用启动)会创建当前 web 应用里面每一个jar包里面ServletContainerInitializer实例︰

2)ServletContainerInitializer  的实现放在  jar 包的META-INF/services  文件夹下,有一个名为javax.servlet.ServletContainerlnitializer的文件,内容就是ServletContainerInitializer  的实现类的全类名

3 )、还可以使用  @HandlesTypes,在应用启动的时候加载我们感兴趣的类;

2.流程︰

1)、启动 Tomcat

2),org\springframeworklspring-web14.3.14.RELEASEIspring-web-4.3.14.RELEASE.jarI\META-INFlservicesljavax.servlet.ServletContainerlnitializer

3 ) 、SpringServletContainerInitializer @HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup 方法的Set>;为这些WebApplicationInitializer 类型的类创建实例;

4)、每一个WebApplicationlnitializer 都调用自己的 onStartup ;

5)、相当于我们的 SpringBootServletInitializer 的类会被创建对象,并执行  onStartup 方法

6 ) 、SpringBootServletlnitializer 示例执行  onStartup  的时候会  createRootApplicationContext ;创建容器

protected webApplicationcontext createRootApplicationContext(

Servletcontext servletcontext) {

//1、创建 SpringApplicationBuilder

SpringApplicationBuilder

//调用  configure 方法,子类重写了这个方法,将 SpringBoot的主程序类传入了进来

builder = createSpringApplicationBuilder();

//使用  builder  创建一个  Spring  应用

StandardServletEnvironment environment = new StandardServletEnvironment();

environment.initPropertySources(servletcontext, null);

builder.environment(environment);

builder.main(getclass());

ApplicationContext parent = getExistingRootwebApplicationContext(servletContext);if (parent != null){

this.logger.info("Root context already created (using as parent). ");servletcontext.setAttribute(

webApplicationcontext.ROOT_wEB_APPLICATION_CONTEXT_ATTRIBUTE, null);

builder.initializers(new ParentContextApplicationContextInitializer(parent));}

builder.initializers(

new ServletContextApplicationContextInitializer(servletContext));builder.contextClass(AnnotationConfigEmbeddedwebApplicationContext.class);builder = configure(builder);

SpringApplication application = builder.build();

if (application.getSources().isEmpty() && Annotationutils

.findAnnotation(getclass(),configuration.class) != null){application.getSources().add(getclass());

}

if (application.getsources().isEmpty() && Annotationutils

.findAnnotation(getclass(), configuration.class) != null){application.getSources().add(getclass());

Assert.state(!application.getSources ().isEmpty(),

"No SpringApplication sources have been defined. Either override the"

+ "configure method or add an @Configuration annotation");

// Ensure error pages are registered

if(this.registerErrorPageFilter) {

application.getSources ().add(ErrorPageFilterConfiguration.class);}

//启动  Spring  应用

return run(application);

}

7) 、Spring  的应用就启动并且创建 IOC  容器

public configurableApplicationContext run(String... args){

Stopwatch stoplwatch = new Stopwatch();

stopwatch.start();

ConfigurableApplicationcontext context =null;FailureAnalyzers analyzers = null;

configureHeadles sProperty();

SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();

try {

ApplicationArguments = new DefaultApplicationArguments(

args);

ConfigurableEnvironment environment = prepareEnvironment(listeners,

applicationArguments);

Banner printedBanner = printBanner(environment);context = createApplicationcontext();

analyzers = new FailureAnalyzers( context);

prepareContext(context,environment, listeners, applicationArguments,

printedBanner);

//刷新 IOC  容器

refreshContext(context);

afterRefresh(context,applicationArguments);listeners.finished(context,null);

stoplatch.stop();

if (this.logStartupInfo){

new StartupInfoLogger(this.mainApplicationclass)

. logStarted(getApplicationLog(),stoplatch);

}

return context;}

catch (Throwable ex){

handleRunFailure(context, listeners,analyzers,ex);throw new IllegalstateException(ex);

}

 

二、核心

1、SpringBootServletlnitializer– 重写 configure

2、SpringApplicationBuilder

- builder.source(@SpringBootApplication类)

3、启动原理

一Servlet3.0 标准 ServletContainerlnitializer 扫描所有 jar 包中META-

INF/services/javax.servlet.ServletContainerlnitializer 文件指定的类并加载

 加载 spring web 包下的 SpringServletContainerlnitializer

一 扫描  @HandleType(WebApplicationInitializer)

一 加载SpringBootServletlnitializer 并运行 onStartup 方法+

 加载  @SpringBootApplication 类,启动容器等

相关文章
|
3月前
|
Docker 容器
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
|
6月前
|
Java 应用服务中间件 容器
25 SpringBoot使用外置的Servlet容器
25 SpringBoot使用外置的Servlet容器
23 0
|
2月前
|
网络协议 前端开发 Java
异步Servlet学习笔记(一)
异步Servlet学习笔记(一)
|
8月前
|
存储 PyTorch 算法框架/工具
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
76 0
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
|
4月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.10 容器回退
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
47 0
|
9月前
|
C++ 容器
C++学习笔记_19 适配器容器-stack queue 2021-05-19
C++学习笔记_19 适配器容器-stack queue 2021-05-19
|
6月前
|
前端开发 Java 应用服务中间件
24 SpringBoot配置嵌入式Servlet容器
24 SpringBoot配置嵌入式Servlet容器
38 0
24 SpringBoot配置嵌入式Servlet容器
|
8月前
|
XML 存储 前端开发
Servlet技术入门(视频学习笔记)-2
2、ServletContext类的四大作用 获取web.xml中配置的上下文参数context-param 获取当前工程路径,格式:/工程路径 获取工程部署在服务器硬盘上的绝对路径
|
8月前
|
小程序 Java 应用服务中间件
Servlet技术入门(视频学习笔记)-1
一、Servlet技术 1、什么是Servlet Servlet是JaveEE规范之一,规范就是接口 Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器 Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送来的请求,并响应数据给客户端
|
9月前
|
存储 C++ 索引
C++学习笔记_18 线性容器(vector_list_deque)总结 2021-05-18
C++学习笔记_18 线性容器(vector_list_deque)总结 2021-05-18