SpringBoot——Servlet容器启动解析

作者&投稿:莫魏 (若有异议请与网页底部的电邮联系)
~

SpringBoot1.x只区分web环境和非web环境,而在2.x版本中引入了Reactive环境,即响应式环境.那么现在SpringBoot支持三种环境:
Servlet的web环境、Reactive的web环境以及非web环境。90%以上的公司使用的是Servlet的web环境,而该环境默认使用的是tomcat容器,本章内容主要就是介绍Servlet容器启动流程。

Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。

由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是一个用 C 语言实现的 HTTP Web 服务器;这两个 HTTP web server 不是捆绑在一起的。Tomcat 包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

在SpringApplication.run(Application.class,args)里面会构造一个SpringApplication对象,进入其构造函数中

在SpringApplication的run方法中,context = createApplicationContext()代表创建应用上下文,其就是根据属性webApplicationType来构造什么类

servlet容器启动是在refreshContext(context)方法当中,该方法最终会调用AbstractApplicationContext类中的refresh()方法,该方法会调用onRefresh()方法

onRefresh()方法由子类实现,根据不同的应用上下文去调用不同的方法,这里为Servlet容器环境,所以调用ServletWebServerApplicationContext类中的onRefresh()方法

接着看initPropertySources()方法

这样就完成了webServer即Tomcat服务器的创建
在进入AbstractApplicationContext中refresh()方法中的finishRefresh()方法中,该方法会根据web容器的环境进行调用,这里会进入ServletWebServerApplicationContext类中的finishRefresh()方法中

默认返回只有一个TomcatServletWebServerFactory,那么这个bean定义什么时候被加载到容器中

它是通过ConfigurationClassParser类中的parse方法,通过@Import注解导入到容器中的

deferredImports.forEach(handler::register),这边主要是构造了一个grouping,在下一步进行处理handler.processGroupImports()

这边就到了AutoConfigurationImportSelector类的getAutoConfigurationEntry方法中

通过filter方法过滤,过滤完发现只有22个了

过滤完之后会发现此时List<String> configurations集合中有29个,其中有一个 org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

到此为止grouping.getImports方法分析完了,它是返回之前加载的29个自动配置类

入口,onRefresh方法中会创建webServer,走到这里

在Bean初始化完成之后会遍历BeanFactory中所有的BeanPostProcessor实现,依次调用BeanPostProcessor接口的postProcessBeforeInitialization方法,在创建Web服务的工厂类的时候也会经历这个步骤,这个方法调用点就在AbstractAutowireCapableBeanFactory类中applyBeanPostProcessorsBeforeInitialization()方法

可以看到postProcessBeforeInitialization方法多个实现中有一个WebServerFactoryCustomizerBeanPostProcessor

点击进入WebServerFactoryCustomizerBeanPostProcessor类中的postProcessBeforeInitialization方法

我们在来看下图中第二个定制器,ServletWebServerFactoryCustomizer是怎么注入的呢?

参考:
https://my.oschina.net/liwanghong/blog/3168322

https://www.cnblogs.com/hggen/p/6264475.html

https://www.cnblogs.com/jingmoxukong/p/8258837.html




怎么做无盘网吧系统?
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

无盘怎么做呀
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

网吧无盘系统怎么做
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

怎么给网吧做无盘系统
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时...

乾安县17196364505: 如何确认 spring boot servlet 版本 -
萧帝硝普: 这个跟spring mvc一样的啊,首先你看你的spring-mvc.xml 有没有配置defaultViewResolver, 然后你在action的方法中如果1.标注了@ResponseBody,返回字符串的话是通过write输出到页面.2.没有标注这个,spring mvc会到配置的目录下 找相应的jsp....

乾安县17196364505: 如何查看 spring boot 版本 -
萧帝硝普: 打开自己项目的jar包,进入\BOOT-INF\lib路径,就可以看到依赖的springboot版本的jar包

乾安县17196364505: 如何使用springboot快速构建后台 -
萧帝硝普: 要Spring Boot进行功能开发,需要使用Gradle或者Maven作为构建工具.在本例中,我们会使用Eclipse和Maven插件进行开发.要使用Spring Boot,首先创建一个Maven工程,并修改Maven主要的配置文件pom.xml

乾安县17196364505: 如何运行Spring Boot应用 -
萧帝硝普: Spring Boot 是 Spring 产品中一个新的子项目,致力于简便快捷地搭建基于 Spring 的独立可运行的应用.大多数的 Spring Boot 应用只需要非常少的 Spring 配置.你能够使用 Spring Boot 创建 Java 应用并通过 java -jar 来运行或者创建传统的通过 war 来部署的应用.Spring Boot 也提供了一个命令行工具来运行 spring 脚本.Spring Boot 的目标是:快速开发基于 Spring 的应用 开箱即用的微服务 提供一些大型项目常用的非功能性特性,例如:嵌入式服务、安全、监控、健康检查、外部配置 不用生成代码,没有 xml 配置

乾安县17196364505: spring - boot程序怎么发布 -
萧帝硝普: 1 用win+R打开”运行对话框“,并输入services.msc,然后按下Enter键2 在新打开的”服务“框里找到Windows Firewall这一行.(此时在它的”启动类型“栏里会显示禁用)3 将”禁用“更改为”手动“方法/步骤2然后可直接点左边的”启动“2 然后windows防火墙就开启了

乾安县17196364505: spring boot 怎么配置拦截器 -
萧帝硝普: 第一种模式BIOS:在将Secure Boot设置为Enabled后,Secure Boot Status依然为关闭状态.步骤1:在机器重启至bios界面时,不停敲击“F2”键或“Del”键进入BIOS,不同主板按键不一样,大家可以注意bios下方一般有按键提示.进入bios...

乾安县17196364505: spring boot框架的web.xml文件怎么配置 -
萧帝硝普: 首先我们先配置welcomefile-list 我们先声明一个类继承WebMvcConfigurerAdapter 重写如下方法即可 注解不能忘 @Configuration@EnableWebMvc@ComponentScan(basePackages = @Overridepublic void addViewControllers(...

乾安县17196364505: spring boot启动报错 application startup failed怎么解决 -
萧帝硝普:把servlet-api的依赖删除,启动正常. springBoot启动jar包.1.xxmy org.springframework spring-context 3.2.8.RELEASE org.springframework spring-context 4.3.7.RELEASE org.springframework spring-webmvc 3.2.8.RELEASE ...

乾安县17196364505: 如何设置springboot的端口 -
萧帝硝普: web服务器的端口在Spring Boot中是以server.port这个属性存在的,以下方法都可以推而广之到任何属性: 修改Spring Boot应用类路径上的application.properties文件,设置server.port=1234,1234就是你想要的端口. 在启动Spring Boot应用的...

乾安县17196364505: spring boot支持win10吗 -
萧帝硝普: 好用.在MacBook上装win10的体验是与在win下的win10一样的应用 在Mac上安装Windows,基本上可以通过两种方式来实现:虚拟机及双系统.方法一:Mac虚拟机安装Win10系统方法 首先下载ISO文件,虚拟机的选择包括VirtualBox、...

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网