Spring Boot内嵌Tomcat(非常详细)
Spring Boot 对于 Web 项目默认内置一个服务器,把项目打包成一个可执行的 jar 文件,这样项目发布后就不需要额外安装 Web 服务器了。
Spring Boot 默认内置的服务器是 Tomcat。
使用嵌入式版本可以把 Tomcat 嵌入 Java 程序中成为一个独立应用,不再需要部署到独立的外部服务器中。
下面我们展示内置服务器的基本使用:
1) 新建一个 Maven 项目,添加依赖,代码如下所示:
2) 编写启动类,代码如下所示:
3) 在 webapp 目录中新建一个 index.jsp,代码如下所示:
4) 跟执行普通 Java 程序一样执行 EmbedServer 中的 main 方法,发现服务器启动了,然后在浏览器中访问,结果如下图所示:
静态内部类 TomcatWebServerFactoryCustomizer 上的 @ConditionalClass 注解,判断当前项目类路径下是否有 Tomcat 类,如下图所示:
如果存在,就创建 TomcatWebServerFactoryCustomizer 对象,用 customize 方法完成 Tomcat 服务器配置,如下图所示:
Spring Boot 应用(无论是否是 Web 应用)可以打包为一个 jar 文件,从一个标准 Java 程序 main 方法执行。在 main 方法中调用 SpringApplicaiton 的 run 方法,并在 main 方法所在类中配置注解 @SpringBootApplication,触发自动配置,默认扫描所在包以及子包下的组件。
Spring Boot 默认内置的服务器是 Tomcat。
内嵌Tomcat
在 Tomcat 官网下载页面中提供了 Tomcat 的嵌入版本,如下图所示:
使用嵌入式版本可以把 Tomcat 嵌入 Java 程序中成为一个独立应用,不再需要部署到独立的外部服务器中。
下面我们展示内置服务器的基本使用:
1) 新建一个 Maven 项目,添加依赖,代码如下所示:
<!--提供Tomcat核心功能--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.58</version> </dependency> <!--提供JSP翻译、编译等功能--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>8.5.58</version> </dependency>
2) 编写启动类,代码如下所示:
public class EmbedServer {
public static void main(String[] args) {
Tomcat tomcat = new Tomcat();
// 修改默认端口
tomcat.setPort(9999);
// 设置应用的根目录
tomcat.getHost().setAppBase(System.getProperty("user.dir") + "/.");
/**
* 添加一个 webapp 应用到服务器
* contextPath:用于上下文映射
* docBase:上下文的根目录
*/
Context context = tomcat.addWebapp("/test", "src/main/webapp");
// 以编程方式添加一个 Servlet
Tomcat.addServlet(context, "helloWorld", new HttpServlet() {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().println("Hello World");
}
});
context.addServletMappingDecoded("/hw", "helloWorld");
try {
tomcat.start();
tomcat.getServer().await(); // 防止程序立即结束
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
3) 在 webapp 目录中新建一个 index.jsp,代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>helloworld</title>
</head>
<body>
<h1>HelloWorld!</h1>
<%=1 + 2%>
</body>
</html>
4) 跟执行普通 Java 程序一样执行 EmbedServer 中的 main 方法,发现服务器启动了,然后在浏览器中访问,结果如下图所示:


Spring Boot内嵌Tomcat原理
Spring Boot 默认采用内置 Web 服务器的方式,可扩展性较好,并提供多种 Web 服务器(例如 Tomcat、Jetty)的支持,类关系如下:静态内部类 TomcatWebServerFactoryCustomizer 上的 @ConditionalClass 注解,判断当前项目类路径下是否有 Tomcat 类,如下图所示:

如果存在,就创建 TomcatWebServerFactoryCustomizer 对象,用 customize 方法完成 Tomcat 服务器配置,如下图所示:

Spring Boot 应用(无论是否是 Web 应用)可以打包为一个 jar 文件,从一个标准 Java 程序 main 方法执行。在 main 方法中调用 SpringApplicaiton 的 run 方法,并在 main 方法所在类中配置注解 @SpringBootApplication,触发自动配置,默认扫描所在包以及子包下的组件。
ICP备案:
公安联网备案: