这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
我们上一章就说过我们可以使用外置的Servlet容器,我们原本创建Spring Boot项目想要打包,部署到我们服务器上是打成Jar包的方式,但是我们也可以使用war的方式,两种打包方式都有各自的好处,我们下面进行分析。
嵌入式Servlet容器:应用打成可执行的jar
优点:简单、便携;
缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);
外置的Servlet容器:外面安装Tomcat—应用war包的方式打包;
我们之前使用的是jar的方式来创建我们的项目,这回我们使用war的方式来创建项目
1.新建一个项目,打包方式选择war
2.选择模块时,我们还是选择一个Web。
创建好像项目时是没有webapp的
3.我们按下Ctrl+Shift+Alt+S
选择一个正确的位置
4.配置好我们的Tomcat
5.部署工件
6.创建一个jsp页面
7.启动
jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;
\
war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;
\
servlet3.0(Spring注解版):
\
8.2.4 Shared libraries / runtimes pluggability:
\
规则:
1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:
2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名
3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;
流程:
1)、启动Tomcat
2)、org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer:
Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer
3)、SpringServletContainerInitializer将@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup方法的Set<Class<?>>;为这些WebApplicationInitializer类型的类创建实例;
4)、每一个WebApplicationInitializer都调用自己的onStartup;
5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法
6)、SpringBootServletInitializer实例执行onStartup的时候会createRootApplicationContext;创建容器
1 | scss复制代码protected WebApplicationContext createRootApplicationContext( |
7)、Spring的应用就启动并且创建IOC容器
1 | ini复制代码public ConfigurableApplicationContext run(String... args) { |
\
启动Servlet容器,再启动SpringBoot应用
\
本文转载自: 掘金