揭秘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请求
总结
通过上面分析,大致流程如下
通过自动装配默认加载了DispatcherServlet,所有请求都会转发到DispatcherServlet
DispatcherServlet的doService方法中拿到HttpServletRequest和HttpServletResponse对象
从HttpServletRequest可以拿到我们的http头、url请求等信息根据获取的信息,从ioc容器中找到对应的Controller对应的action,进行反射调用
根据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报错说 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(代码片