在之前传统的Spring应用中我们都会采用外部容器来运行应用,但是在Spring Boot 中与传统应用的不同就说在Spring Boot应用中不需要额外的应用服务器也可以运行。这是是因为在Spring Boot应用中内置了一个内部容器,所以我们在项目启动的时候只需要启动Jar包即可。那么在Spring Boot中自带了那些内置的容器呢?并且如何使用这些内置容器呢?
Spring Boot 内置容器
在我们一般的SpringBoot项目中所指的容器都是指Servlet容器,根据Spring Boot版本的不同,内置容器Servlet的版本也略有差异。如下图所示。
从图中我们可以看出了Spring Boot 与Servlet的对应关系。在使用Spring Boot 应用的时候,我们不需要添加任何的配置,只需要添加与Web开发相关的Starter就可以将项目转换成Web应用开发模式。在应用启动的时候,就会采用系统内置的容器来运行项目。相比较于传统的开发方式,省去了部署容器的步骤,整体的提升了开发效率。那么这套容器运行的流程到底是什么样子呢?
Spring Boot 容器运行流程
首先来讲根据Spring Boot的自动配置的原理,首先需要检查的就是再对应的项目依赖是否存在,并且相关的自动场景启动器是否存在。在相关依赖中我们会找到如下的依赖项
org.springframework.boot
spring-boot-starter-tomcat
2.7.5
compile
并且自动运行的Tomcat其主要运行原理就是通过这个Starter来实现的。并且查看其相关的依赖会发现有如下的核心依赖项。
org.apache.tomcat.embed
tomcat-embed-core
9.0.68
compile
tomcat-annotations-api
org.apache.tomcat
所以,从上面的代码中我们可以看出,Spring Boot的内置容器是基于Apache Tomcat的内置版本实现。使用了内置的Tomcat就不需要将应用打包成War包,只需要将应用打包成JAR包的方式即可运行,这也正是Spring Boot可以单独运行不需要额外的应用服务器的原因。这种实现方式让传统的Web应用服务更容易被微服务化或者是容器化。关于Spring Boot中对于Tomcat的自动配置,有兴趣的读者可以自己查看相关的代码,这里不做多余说明了。
虽然我们说了Tomcat作为SpringBoot应用的默认的应用服务器,是不是就是说Spring Boot支持Tomcat作为内置服务器呢?显然不是,我们看到在Spring Boot项目中Tomcat容器是以依赖的方式被添加到POM文件中的,也就是说我们可以将容器替换成为其他的服务容器。这里我们以Jetty为例来实现容器的替换。
Spring Boot Tomcat容器替换为Jetty容器
既然要使用其他的容器,那么首先就需要将当前容器从项目依赖中移除。我们可以通过下面这种方式来进行移除,并且将Jetty容器添加到项目项目中
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
这个时候我们可以启动项目,就可以看到容器已经被替换成了Jetty容器
虽然大部分的Spring Boot应用都是运行在Tomcat容器中的,但是在很少的一部分情况下,我们还是希望能将其运行到外部的Apache Tomcat容器中,这个时候,我们应该如何实现这个操作呢?
如何将Spring Boot应用运行到外部的Tomcat容器中?
既然要采用外部容器的方式来运行项目,那么首先我们就得从Tomcat的官方网站上找到相关的Tomcat容器将外部容器的环境搭建好,这里关于Tomcat容器的搭建读者可以参考网络教程。这里不做过多的说明。
我们知道Spring Boot应用默认的打包方式是Jar的方式,既然我们要使用外部的Tomcat来运行的话,那么就得将打包方式改成War包的方式。这个时候就需要我们在POM文件中添加如下的操作。将Jar包方式改成War包方式。
war
接下来就是将内置的Tomcat依赖关系中进行移除操作。为了保证编译能够成功,需要将Servlet的相关依赖添加到POM文件中。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-tomcat
provided
修改完成之后,需要修改原来的打包方式,既然我们要采用外部容器,那么我们的打包方式就要变成War包方式,所以需要将 Build模块中的相关打包的插件去掉。代码如下
${artifactId}
由于我们将Tomcat的的相关依赖移除了,所以说相关的自动配置内容也被移除了,所以这个时候我们需要手动将相关的应用初始化的容器中进行运行。这里Spring Boot提供了一个
SpringBootServletInitializer的类这个类继承了WebApplicationInitializer。关于WebApplicationInitializer的相关内容,有兴趣的读者可以自己了解。
public abstract class SpringBootServletInitializer implements WebApplicationInitializer {
}
我们在项目主启动类上进行如下的修改。
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这个时候我们就可以通过package的方式进行打包测试了。会看到打包完成之后在对应的target目录下面生成了相应的war包
我们可以通过修改Tomcat的相关配置来查看项目存在。我们可以进入到Tomcat的conf目录下修改如下的配置文件 tomcat-users.xml
将War包放入的WebAPP目录中启动Tomcat
点击Manager APP 输入配置好的用户名密码进行登录,会看到如下的页面。并且在应用管理中看到了demo的测试项目
到这里我们就实现了在外部容器中运行Spring Boot项目的全部功能。
总结
上面我们介绍了如何替换SpringBoot中的运行容器,在不同的项目中根据不同的项目需求,开发者可以使用不同的方式进行部署,如果想要了解内置容器相关的更多配置内容,可以参考Spring Boot的官方文档实现。
Tags:安装tomcat步骤