揭秘springboot集成tomcat原理

共 2825字,需浏览 6分钟

 ·

2021-01-06 15:07

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享

前言

曾几何时,我们使用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

dispatcherServlet
  org.springframework.web.servlet.DispatcherServlet
  
    contextConfigLocation
    classpath:spring-mvc.xml
  

  1


  dispatcherServlet
  /


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从入门到入土学习路线图

???

?长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 77
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报