springBoot以war包的启动原理

  • 1.前言
  • 2.jar包和war包的区别
  • 3.war包的启动原理
  • 3.1 SpringBoot将jar转换为war包
  • 3.2 SpringServletContainerInitializer的war包启动的关联
  • 3.3 触发onStartup的方法
  • 4.总结


1.前言

SpringBoot有两种启动方式,分别是jar包启动和war包启动。在jar包里已经自带Web容器,不需要额外安装web容器。war包方式启动,首先需要安装Web容器,如果想要修改Web容器里配置,还需专门去Web容器里配置。既然springboot的jar包的方式这么方便快捷,为什么还要多此一举设计这个war包启动?下面我将会一一讲解。

2.jar包和war包的区别

jar包:在jar包中直接通过内置web容器运行,不需要额外安装web容器。如需修改内置web容器的配置,只需要在spring boot的配置文件中配置。比较方便,快速,比较简单。

war包:在jar中只内置3种web容器,如果公司需要用其他高性能的web容器,3种内置的web容器可能不满足公司的需求,springboot帮我们考虑到这种情况,因此还设计了以war包方式启动。war包以传统的应用方式,需要安装额外的web容器,可以灵活选择web容器版本,可以直接修改web容器的配置,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。

3.war包的启动原理

3.1 SpringBoot将jar转换为war包

首先将pom.xml文件的packaging属性改为war,然后排除tomcat的依赖(以tomcat为例),在主配置类中继承SpringBootServletInitializer,然后重写configure方法,最后以额外的web容器启动项目。(这个比较简单我就不贴图了)

3.2 SpringServletContainerInitializer的war包启动的关联

@HandlesTypes这个注解,在我的理解中表示所关注的类。在SpringBootServletInitializer类中实现了WebApplicationInitializer接口,因此代码是这样关联起来的。

spring boot starter jar包里的pom怎么生成的 springboot jar包运行原理_war包


spring boot starter jar包里的pom怎么生成的 springboot jar包运行原理_war包_02

3.3 触发onStartup的方法

spring boot starter jar包里的pom怎么生成的 springboot jar包运行原理_war包_03


在创建web应用的方法最后,我们看到run方法(启动IOC容器),这里和jar包的启动方式差不多,我就不贴图了,大家可以参考我的springBoot以jar包的启动原理

spring boot starter jar包里的pom怎么生成的 springboot jar包运行原理_jar包_04

4.总结

jar包的启动方式,以IOC带动Web容器启动,而war包和jar相反,是通过web容器带动IOC启动项目。