Servlet容器启动解析

1. Servlet Web环境介绍

目前web环境主要有Servlet和Rective,而大部分web应用使用的还是Servlet容器,web服务器又主要以Tomcat为主。所以接下来我会以Servlet容器作为解析重点。

2. 容器启动主要流程

从下图我们可以看出Servlet的启动流程从SpringApplication的初始化到运行run方法,再到AbstractApplicationContext的refresh方法。详细流程参考下图:

3. Web容器工厂类加载解析

我们知道在createWebServer方法会去获取ServletWebServerFactory的实现类,那么该实现类是如何被加载的呢?此处需要你对配置解析相关知识有所了解,如果你还不了解,可以查看上一节的文章(配置类解析)。

在启动类的注解@SpringBootApplication内有个@EnableAutoConfiguration注解,在@EnableAutoConfiguration注解内部又有一个@Import注解,该注解导入了一个类AutoConfigurationImportSelector,该类实现了DeferredImportSelector接口,DeferredImportSelector又继承了ImportSelector接口,通过selectImports方法完成自动装配。该方法最终会到配置解析的ConfigurationClassParser类的processImports方法中。并会调用deferredImportSelectorHandler.handler()方法,在该方法中将DeferredImportSelectorHolder对象放入deferredImportSelectors集合中。

以上步骤中只是完成了deferredImportSelector解析的相关工作,后续的处理是在方法parse(Set<BeanDefinitionHolder> configCandidate)方法中,通过调用this.deferredImportSelectorHandler.process()方法(DeferredImportSelectorHandler是ConfigurationClassParse类的内部类),在该方法中遍历上面的deferredImportSelectors集合,调用DeferredImportSelectorGroupingHandler(ConfigurationClassParser内部方法)的register方法,根据AutoConfigurationGroup完成DeferredImportsSelectorGrouping的实例化,将deferredImport放入DeferredImportsSelectorGrouping中。

之后再调用DeferredImportSelectorGroupingHandler的processGroupImports方法。首先遍历上步骤实例化的DeferredImportsSelectorGrouping,调用其getImports方法,在该方法中我们会遍历DeferredImportSelector集合deferredImports,调用其process方法,该方法的实现类是AutoConfigurationImportSelector,这个类就是我们@SpringBootApplication注解中@Import注解导入的类,在该方法中调用了getAutoConfigurationEntry方法,该方法是加载自动装配配置的核心方法,其方法内有个getCandidateConfigurations方法,该方法就是使用SpringFactoriesLoader从spring.factories的配置文件中加载EnableAutoConfiguration的配置类。之后经过去重、排除类和过滤(AutoConfigurationImportFilter的实现类只有3个,分别是OnBeanCondition、OnClassCondition和OnWebApplicationCondition),最终调用了fireAutoConfigurationImportEvents方法发布事件,最后将加载的配置类封装成AutoConfigurationEntry对象。

由上面加载的配置类中有一个配置类ServletWebServerFactoryAutoConfiguration,在该配置类中使用@Import方法导入了EmbeddedTomcat类,该配置类生效的条件是:存在Servlet class、存在Tomcat class、存在UpgradeProtocol class。在该类的内部使用@Bean注解注入了TomcatServletWebServerFactory,该类实现了ServletWebServerFactory接口。此时当创建web容器的时候就可以获取到ServletWebServerFactory工厂了。

Web容器工厂类加载流程比较长,其中逻辑还是比较复杂,可以对照上图流程DEBUG代码去跟踪理解。至此,Web容器启动核心逻辑解析差不多就算完成了,如需了解springboot更多详解请移步至公众号EthanBai查看。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值