揭秘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
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请求
总结
通过上面分析,大致流程如下
通过自动装配默认加载了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从入门到入土学习路线图
???
?长按上方微信二维码 2 秒
感谢点赞支持下哈