SpringBoot与Tomcat的启动(内嵌Tomcat)

SpringBoot与Tomcat的启动(内嵌Tomcat),第1张

环境:

SpringBoot 2.0.1

使用SpringBoot开发时,可以通过Maven将工程打成jar包,jar包内嵌Tomcat,这种方式SpringBoot工程将在启动的时候,带动Tomcat的启动,下面分析SpringBoot如何带动Tomcat启动

一个简单的SpringBoot工程启动类

跟进 SpringApplication#run 方法

如果对Spring的启动流程有了解的话,应该知道Spring启动过程中,最重要的就是 AbstractApplicationContext#refresh() 过程,在这个方法中Spring执行了BeanFactory的初始化,Bean的实例化、属性填充、初始化操作等等重要的操作,该方法主要逻辑如下:

仔细观察这个方法,可以发现其中调用了几个空方法,这里应用了 模板模式 ,在 refresh 方法中定义了主干执行流程,并留有空的方法给子类做个性化定制

现在开始,通过debug来看看SpringBoot如何启动Tomcat容器

前面构造 SpringApplicaton 时,已经推断出当前Web工程类型,当开始执行 #run 方法时,会根据不同类型的Web项目创建不同类型的ApplicationContext

创建好 ApplicationContext 之后,看到 refreshContext(context) ,联系本文开头Spring启动的 AbstractApplicationContext#refresh 方法,该方法其实就是触发了后者的执行

执行 refreshContext 方法,来到前面根据 webApplicationType 创建的容器类 ServletWebServerApplicationContext

进入到 TomcatServletWebServerFactory ,可以看到如下启动内置Tomcat的过程

至此,Tomcat继承Spring的 AbstractApplicationContext 类,覆盖它的模板方法 onRefresh ,SpringBoot在自身启动的过程中,启动了内置的Tomcat服务器

开启服务器时如果不调用spring的话,spring是不会做什么的。一般web项目会在web.xml里配置spring的加载监听。这样启动web服务器时就会加载spring的配置文件,spring的bean工厂会启动,根据配置文件中配置的bean对象的类型和属性信息,通过反射将类实例化并且将类的属性通过set方法、构造器、接口等方式设置到对象中。通过spring的getBean方法可以根据bean的id来获取到实例化后的bean对象。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/346662.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-07
下一篇2023-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存