揭秘springboot集成tomcat原理

Posted java1234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了揭秘springboot集成tomcat原理相关的知识,希望对你有一定的参考价值。

优质文章,第一时间送达

前言

曾几何时,我们使用springboot后使用内置的tomcat项目进行启动项目,但是这里是如何集成的可能我们并不清楚,本文发表一些笔者的理解和看法

在这里先抛出一些原生Tomcat作为web服务器的知识,Tomcat称之为web容器,也可以称之为servlet容器,原因如下:

  • web容器:用来与我们的浏览器做交互,即与http请求做交互

  • servlet容器:与http请求做交互的时候,如何调用我们的业务代码呢?这个时候就需要我们的servlet规范了,各个web容器厂商只要实现servlet规范,即可制作自己的web容器了。而我们的业务代码也可以基于servlet规范下进行我们的业务代码调用了。

servlet规范也就是我们常见的servlet-api.jar中定义的规范了,在原生tomcat里面也是默认加载了该jar包。

springboot

在我们的springboot中使用了内置的tomcat,servlet规范也使用了自己的类,主要类即ervlet.java类,代码如下:

public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

主要也就是以上几个方法,最关键的即是service方法来处理我们的业务代码,这个类在servlet-api中也是这么定义的。

这就是我们的Servlet规范了

传统项目

在我们以前使用springmvc的项目中都会在web.xml中配置DispatcherServlet,也就是把我们任意的请求全部转发给DispatcherServlet的service

<servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

DispatcherServlet

DispatcherServlet间接的实现了Servlet接口,实现了servlet规范,也就是我们只要在配置文件中定义DispatcherServlet,那么所有请求都可以转发到DispatcherServlet中

在springboot中我们不在配置DispatcherServlet了,而是又springboot的自动装配来默认装载,自动装配的原理在此不做介绍,简单的说就是默认加载META-INF/spring.factories定义的类,然后我们就可以在spring.factories中找到我们的关键类DispatcherServletAutoConfiguration


在DispatcherServletAutoConfiguration里面有这么一个bean

@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
 public DispatcherServlet dispatcherServlet() {
  DispatcherServlet dispatcherServlet = new DispatcherServlet();
  dispatcherServlet.setDispatchOptionsRequest(
    this.webMvcProperties.isDispatchOptionsRequest());
  dispatcherServlet.setDispatchTraceRequest(
    this.webMvcProperties.isDispatchTraceRequest());
  dispatcherServlet.setThrowExceptionIfNoHandlerFound(
    this.webMvcProperties.isThrowExceptionIfNoHandlerFound());
  dispatcherServlet.setEnableLoggingRequestDetails(
    this.httpProperties.isLogRequestDetails());
  return dispatcherServlet;
 }

这里也就可以看出来springboot默认创建了一个DispatcherServlet来处理http请求

总结

通过上面分析,大致流程如下

  1. 通过自动装配默认加载了DispatcherServlet,所有请求都会转发到DispatcherServlet

  2. DispatcherServlet的doService方法中拿到HttpServletRequest和HttpServletResponse对象
    从HttpServletRequest可以拿到我们的http头、url请求等信息

  3. 根据获取的信息,从ioc容器中找到对应的Controller对应的action,进行反射调用

  4. 根据HttpServletResponse返回调用结果给浏览器渲染

看到这个流程,相信大家对应tomcat处理http请求的流程就会有一个清晰的了解了,而springboot中的内置tomcat,基本组件都是参考自原生Tomcat的,即使我们自己写一个简易的tomcat来处理请求也不是什么难事。

以上就是笔者对springboot中tomcat处理的一些见解!



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/qq_31086797/article/details/111876084





粉丝福利:Java从入门到入土学习路线图

以上是关于揭秘springboot集成tomcat原理的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot源码之Tomcat加载原理分析

SpringBoot-

springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException(代码片

SpringBoot+Spring Batch+Oracle

Spring Boot 揭秘与实战 实用技术篇 - FreeMarker 模板引擎

SpringBoot - Processing of multipart/form-data request failed. Unexpected EOF read on the socket(代码片