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,触发自动配置,默认扫描所在包以及子包下的组件。