tomcat底层动作跟踪图
2021-11-08 17:18:04 0 举报
分析tomcat启动过过程,分析springboot内置tomcat启动原理,分析tomcat下的springboot项目启动过程,开发个性化mappingRequest组件指导
作者其他创作
大纲/内容
Processor
Handler
二、tomcat处理请求的过程
八、自定义HandlerMapping
Container
五、Servlet在哪里被初始化
六、DispatcherServletr初始化
Endpoint
Connector
四、Tomcat Connector中的调用链
一、Servlet3.0服务器启动策略
不使用web.xml配置,使用java代码实现与springMvc整合配置:Spring将Servlet配置相关的转给了WebApplicationInitializer Spring 3.2 提供了一个继承了 WebApplicationInitializer 接口的基类 AbstractAnnotationConfigDispatcherServletInitializer。 只需要继承 AbstractAnnotationConfigDispatcherServletInitializer,就会被发现而用于 servlet 容器的配置。 这种做法,就可以不用在web.xml中申明DispatcherServlet 用这个方法注册时,必须把Filter等web组件在本类中相关方法里显式注册,否则不能被识别下面给出样例写法:public class WebComponentsInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext);//父类的父类中初始化了DispatcherServlet /* * //在下面可以注册自己的个性化 * Servlet Dynamic myServlet = servletContext.addServlet(\"myServlet\
了解DispatcherServlet的工作过程后,可以自定义HandlerMapping或者Interceptor来完成特殊任务。Interceptor可以用于具体handler工作前后做日志、安检等任务。HandlerMapping可以用来做自定义注解识别、handler指派等任务。自定义样例:
spring-web-{version}.jar中指定的实现类为org.springframework.web.SpringServletContainerInitializer该类使用了注解@HandlesTypes(WebApplicationInitializer.class)Servlet3.0容器会自动的扫描classpath下面WebApplicationInitializer接口的实现类,并提供给SpringServletContainerInitializer的onStartup()方法SpringBootServletInitializer实现WebApplicationInitializer接口EDK平台中的ApplicationBoot继承SpringBootServletInitializer
七、DispatcherServlet工作过程
java spi:基于接口的模块自动发现和自动装配机制,为接口寻找服务实现,将装配的控制权移到了程序之外。
Acceptor
Tomcat中启动过程中会调用Context的唯一实现类StandardContext的#init()和#start(),在这里Tomcat采用了模板设计模式,StandardContext中实际实现方法对应的是initInternal()和startInternal()。StandardContext#startInternal()解读,有些方法在其父类ContainerBase中:1)调用fireLifecycleEvent()发布一个\"configure_start\" 事件,在众多监听器中有一个ContextConfig监听器,在ContextConfig监听到\"configure_start\
不使用web.xml,而使用java代码实现servlet服务器三大件的配置:span style=\"font-size: inherit;\
Adapter
tomcat的StandardContext#loadOnStartup方法中初始化ServletDispatcherServlet就是一个普通的Servlet(DispatcherServlet extends FrameworkServlet,FrameworkServlet extends HttpServletBean,HttpServletBean extends HttpServlet,HttpServlet extends GenericServlet,GenericServlet extends Servlet)DispatcherServlet#onRefresh中调用initStrategies方法,initStrategies中进行一系列初始化:(1)initMultipartResolver(context);(2)initLocaleResolver(context);(3)initThemeResolver(context);(4)initHandlerMappings(context);(5)initHandlerAdapters(context);(6)initHandlerExceptionResolvers(context);(7)initRequestToViewNameTranslator(context);(8)initViewResolvers(context);(9)initFlashMapManager(context);
ProtocolHandlere
AsyncTimeout
请求
ProtocolHandlere:不同的协议、不同的通信方式,会有不同的实现。ProtocolHandler包含三个部件:Endpoint、Processor、Adapter。1)Endpoint:用来处理底层Socket网络连接,因此Endpoint是用来实现TCP/IP协议的;Endpoint的抽象实现类AbstractEndpoint里面定义了Acceptor和AsyncTimeout两个内部类和一个Handler接口。 1.1)Acceptor:用于监听请求; 1.2)AsyncTimeout:用于检查异步Request的超时; 1.3)Handler:用于处理接收到的Socket,在内部调用Processor进行处理。2)Processor:用来将Endpoint接收到Socket封装成Request,Precessor用来实现Http协议的;3)Adapter:用来将Request交给Container进行具体处理,连接Connector和Container,起到承上启下的作用。 Adapter其实是将请求适配到Servlet容器进行具体的处理。
三、Tomcat中的CoyoteAdapter
收藏
0 条评论
下一页