嵌入式Tomcat

335 阅读2分钟

现在的开发中,微服务已经是主流的架构,Spring Boot与Spring Cloud大行其道。配置Tomcat Server,配置webapp的方式已经逐渐落伍了,Tomcat是如何在时代的浪潮中屹立不倒呢?原因是它提供了对外的接口,其他项目只需要调用接口就可以内嵌的启动一个Tomcat,而不需要繁杂的配置过程。如果快速的内嵌一个Tomcat呢?赶紧来试一下吧!

Tomcat嵌入式启动

1.需要给当前Maven项目依赖内嵌包

Maven仓库

<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-core</artifactId>
  <version>9.0.33</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
  <version>9.0.33</version>
</dependency>

2.编写一个类,实现一个简单的Servlet

HttpServlet httpServlet = new HttpServlet() {
     @Override
     public void service(ServletRequest req, ServletResponse res) throws 		ServletException, IOException {
                res.getWriter().write("hello world.");
      }
};

3.新建一个Tomat,同server.xml一致,先创建Context然后在其下创建具体的Servlet

		// 引入嵌入式tomcat.
        Tomcat tomcat = new Tomcat();
        // 部署应用.
        Context context = tomcat.addContext("/demo",null);
       
        // 添加Servlet,为Servlet指定别名
        Tomcat.addServlet(context,"hello",httpServlet);
		// 添加映射规则
        context.addServletMappingDecoded("/hello","hello");
        // 启动tomcat.
        try {
            tomcat.init();
            tomcat.start();
        } catch (LifecycleException e) {
            System.out.println("===============");
            e.printStackTrace();
        }
        // 阻塞tomcat,等待请求过来.
        tomcat.getServer().await();

4.访问http://localhost:8080/demo/hello即可看到效果

5.如果需要部署现成的web项目,直接添加即可

  Tomcat tomcat = new Tomcat();
        tomcat.addWebapp("项目war解压的path");
        tomcat.init();
        tomcat.start();
        tomcat.getServer().await();

Spring Boot 中启动

在Spring Boot中封装了很多层,跟进一下run():

经过层层run()包装,到了此处,选择refreshContext继续跟进。

怎么知道在这个方法中的? 是因为Spring预留了一个onRefresh()来进行初始化时的额外操作(钩子方法),所以猜测在这里

果然,找到了我们想要的钩子。根据字面意思,选择这个web server的实现类。

使用一个特定的工厂创建了一个Web Server,按照我们的需要选择Tomcat工厂。

看一下这个工厂内部是怎么做的:

是不是跟我们上面内嵌Tomcat的代码很像?因此我们就得出了结论:Spring Boot就是使用内嵌式Tomcat启动的。