首页 > 编程笔记 > Java笔记 阅读:1

Spring Boot内嵌Tomcat(非常详细)

Spring Boot 对于 Web 项目默认内置一个服务器,把项目打包成一个可执行的 jar 文件,这样项目发布后就不需要额外安装 Web 服务器了。

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

相关文章