SpringBoot配置外部Tomcat项目启动流程源码分析(上)

前言

SpringBoot应用默认以Jar包方式并且使用内置Servlet容器(默认Tomcat),该种方式虽然简单但是默认不支持JSP并且优化容器比较复杂。故而我们可以使用习惯的外置Tomcat方式并将项目打War包。一键获取SpringBoot学习笔记

【1】创建项目并打War包

① 同样使用Spring Initializer方式创建项目

② 打包方式选择"war"

③ 选择添加的模块

④ 创建的项目图示

有三个地方需要注意:

  • pom中打包方式已经为war;
  • 对比默认为jar的项目多了ServletInitializer类;
  • 项目结构没有src/main/webapp,且没有WEB/INF web.xml。

ServletInitializer类如下:

public class ServletInitializer extends SpringBootServletInitializer {
   
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
   
return application.sources(SpringbootwebprojectApplication.class);
}
}

pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.web</groupId>
<artifactId>springbootwebproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springbootwebproject</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--这里修改了内置Tomcat的作用域-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

⑤ 补全项目结构

第一种方式,手动创建src/main/webapp, WEB/INF以及web.xml。

第二种方式,使用idea创建,步骤如下:

1.如下图所示,点击项目结构图标

2.创建src/main/webapp

3.创建web.xml

此时项目结构图如下:

【2】使用外部配置的Tomcat启动项目

① 点击"Edit Configurations…"添加Tomcat。

② 设置Tomcat、JDK和端口

③ 部署项目

④ 启动项目

此时如果webapp 下有index.html,index.jsp,则会默认访问index.html。

如果只有index.jsp,则会访问index.jsp;如果webapp下无index.html或index.jsp,则从静态资源文件夹寻找index.html;如果静态资源文件夹下找不到index.html且项目没有对"/"进行额外拦截处理,则将会返回默认错误页面。

index.html显示如下图:

【3】SpringBoot 使用外部Tomcat启动原理

① 首先看Servlet3.0中的规范

  • javax.servlet.ServletContainerInitializer(其是一个接口) 类是通过JAR服务API查找的。对于每个应用程序,ServletContainerInitializer的一个实例是由容器在应用程序启动时创建。
  • 提供servletcontainerinitializer实现的框架必须将名为javax.servlet的文件捆绑到jar文件的META-INF/services目录中。根据JAR服务API,找到指向ServletContainerInitializer的实现类。
  • 除了ServletContainerInitializer 之外,还有一个注解–@HandlesTypes。ServletContainerInitializer 实现上的handlesTypes注解用于寻找感兴趣的类–要么是@HandlesTypes注解指定的类,要么是其子类。
  • 不管元数据完成的设置如何,都将应用handlesTypes注解。
  • ServletContainerInitializer实例的onStartup 方法将在应用程序启动时且任何servlet侦听器事件被激发之前被调用。
  • ServletContainerInitializer 的onStartup 方法调用是伴随着一组类的(Set<Class<?>> webAppInitializerClasses),这些类要么是initializer的扩展类,要么是添加了@HandlesTypes注解的类。将会依次调用webAppInitializerClasses实例的onStartup方法。

总结以下几点:

1)服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面
ServletContainerInitializer实例;

2)jar包的META-INF/services文件夹下,有一个名为
javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名;

如下图所示:

3)还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

4)容器启动过程中首先调用
ServletContainerInitializer 实例的onStartup方法。

ServletContainerInitializer 接口如下:

public interface ServletContainerInitializer {
   
void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}

② 步骤分析如下

第一步,Tomcat启动

第二步,根据Servlet3.0规范,找到
ServletContainerInitializer ,进行实例化

jar包路径:

org\springframework\spring-web\4.3.14.RELEASE\
spring-web-4.3.14.RELEASE.jar!\METAINF\services\
javax.servlet.ServletContainerInitializer:

Spring的web模块里面有这个文件:

org.springframework.web.SpringServletContainerInitializer

第三步,创建实例

SpringServletContainerInitializer将@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup方法的Set集合,为这些WebApplicationInitializer类型的类创建实例并遍历调用其onStartup方法。

SpringServletContainerInitializer 源码如下(调用其onStartup方法):

//感兴趣的类为WebApplicationInitializer及其子类
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
   
//先调用onStartup方法,会传入一系列webAppInitializerClasses
@Override
public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot项目配置Tomcat可以通过以下步骤实现: 1. 在pom.xml文件中添加Tomcat依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> ``` 2. 在application.properties文件中配置Tomcat端口号: ``` server.port=808 ``` 3. 在启动类中添加@EnableAutoConfiguration注解: ``` @SpringBootApplication @EnableAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 4. 打包项目并运行: ``` mvn clean package java -jar target/myproject.jar ``` 以上就是Spring Boot项目配置Tomcat的简单步骤。 ### 回答2: Spring Boot 是一个基于 Spring 框架的快速开发框架,能够非常简便地创建独立的、生产级别的、基于 Spring 的应用程序。当需要将 Spring Boot 应用程序部署到生产环境中时,我们可以将其打包成 war 包或 jar 包,再配置 Tomcat 作为应用程序的 Web 服务器。 首先,在 pom.xml 文件中引入 Spring Boot 的 web 运行时依赖项,即: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 然后,在应用程序的主类上添加注解 `@EnableAutoConfiguration` 和 `@SpringBootApplication`。如下: ``` @SpringBootApplication @EnableAutoConfiguration public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 接着,我们可以在 `application.properties` 或 `application.yml` 中进行相关配置,例如: ``` server.port=8081 server.context-path=/myapp ``` 以上配置Tomcat 服务器端口号设置为 8081,同时将应用程序部署到 http://localhost:8081/myapp。 最后,使用 Maven 命令将应用程序打包成 war 包,例如: ``` mvn clean package ``` 打包完成后,将 war 包复制到 Tomcat 服务器的 webapps 目录下,并启动 Tomcat 即完成项目的部署。 总结:Spring Boot 配置 Tomcat 可以通过引入 web 运行时依赖项、添加启动注解、配置服务器相关属性等操作,最终通过 Maven 命令打包成 war 包部署到 Tomcat 服务器中。 ### 回答3: Spring Boot是一个非常流行的Java Web应用程序框架,它简化了开发者在创建和部署Web应用程序时所需的步骤。Spring Boot支持使用嵌入式web服务器(如Tomcat,Jetty,Undertow等)运行应用程序,也支持将应用程序打成war包并在外部web服务器上运行。本文将详细介绍如何在Spring Boot项目配置Tomcat服务器。 1.添加Tomcat依赖 在Spring Boot项目的pom.xml文件中添加Tomcat依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> ``` 2.配置Tomcat连接器 在application.properties文件中配置Tomcat连接器: ``` server.port=8080 server.tomcat.max-connections=200 server.tomcat.max-threads=100 server.tomcat.uri-encoding=UTF-8 ``` 上述配置中,我们指定了Tomcat服务器的端口、最大连接数、最大线程数、编码方式。 3.构建war包 如果想要将应用程序部署到外部Tomcat服务器上,则需要将应用程序打成war包。在pom.xml文件中添加如下配置: ``` <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 上述配置中,我们指定了打包方式为war,并添加了spring-boot-maven-plugin插件来打包应用程序。 4.部署war包 将打包好的war包复制到外部tomcat服务器的webapps目录下,并启动Tomcat服务器,即可部署应用程序。 最后,通过以上步骤我们已经成功配置Tomcat服务器并将应用程序部署到了外部Tomcat服务器上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值