springboot启动流程

springboot启动流程,第1张

springboot启动流程如下:

启动流程主要分为三个部分,第一部分进行、SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块。

及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。

启动过程主要做了以下几件事情:

配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。

在SpringBoot中启动tomcat的工作在刷新上下这一步。

而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个Connector和一个Container,而一个Container下又包含多个子容器。

spring是咋启动的

         对于应用程序来说,spring的启动是没有什么好说的,直接运行main方法,通过new GenericXmlApplicationContext、ClassPathXmlApplicationContext、XmlBeanFactory等这些容器类,会自动解析xml配置,然后自动进行bean的注入、初始化等,而我们最终也可以从容器中提取这些类,进行各种各样的 *** 作。

       对于web程序来说,并不是直接用main方式调用spring容器进行启动的,而都是以tomcat方式进行启动的,那么tomcat是怎么解析spring的xml配置,怎么进行bean的初始化、注入的呢?

       tomcat其实也是一个main程序。它启动后,调用spring的配置文件的过程如下:

StandContext.startInternal()àStandContext.listenerStart()àContextLoadListener.contextInitialized()àAbstractApplicationContext.refresh().

ContextLoadListener实现了ServletContextListener,因此会调用ContextLoadListener的contextInitialized()方法。

这样就很明了了吧, refresh方法正是spring进行xml解析、bean注入、ioc、aop等等方法的入口。  tomcat会把ServletContextEvent传递给spring, even中有servletContext,这个context也构造出spring的context。最后通过refresh完成大部分的构建、初始化工作。

那么对于springMvc是怎么启动的呢?springMvc的配置文件  spring-servlet.xml是如何解析的呢?

同样还是在tomcat的loadOnStartup()方法中,对大于等于0的servelet进行了调用。

StandardContext.startInternal()àloadOnStartup()àStandardWrapper.load()àload()àloadServlet()àinitServlet()àDispatcherServlet.init()àFrameworkServlet.initServletBean()àrefresh()。  这里加载的是springMvc的配置文件

为什么说springMvc是spring的子容器?

因为spring的配置加载后,然后对DispatcherServlet 进行初始化,最后对springMvc的配置解析是存放在DispatcherServlet 的父类FrameworkServlet 中的webApplicationContext属性容器中。其中在initWebApplicationContext()方法中,通过在ServletContext也即ApplicationContext中set进去的属性“ ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE ”,获取到rootContext,rootContext是前面spring解析出来的容器,setParent(),在webApplicationContext设置父容器rootContext,  通过rootContext然后构建出webApplicationContext。也就是说springMvc是获得到了spring的容器。

子容器可以获取到父容器的内容,而父容器获取不到子容器的内容。

"favlis\5x��

spring-mvc 的启动流程

1、request 请求到达  dispatchServlet->doService()->doDispatch()  开始处理请求

2、根据doDispatch() 再去调用getHandler() 目的是获取包含 处理器Handler和处理器拦截器 AdapterIntercepers 的处理器拦截链 HandlerExecutionChain

        2.1 getHandler(HttpServletRequest request) 通过HandlerMappping对象获取HandlerExecutionChain

3、再通过getHandlerAdapter() 在拦截链中获取handler对应的处理器适配器  handleAdapter

4、ha.handler(processedRequest, response, mappedHandler.getHandler()) 通过handlerAdapter来调用具体的处理器 完成对请求的处理

        4.1 hanler 调用 SimpleServletHandlerAdapter.service()->HttpServlet.service()->HttpServlet.service()->doGet(req, resp)

        在这里我们发现不只是调用doGet()请求,而是根据请求方法来决定调用doGet()还是doPost(),或者其他

         这里发现请求有如下:doGet(req, resp);doHead(req, resp)doPost(req, resp)

          doPut(req, resp)doDelete(req, resp)doOptions(req,resp)doTrace(req,resp)

5、根据handler返回的ModleAndView来决定是否渲染试图  ModleAndView 将modle 和 view 封装在一起

6、ViewResolver:视图解析器    负责将处理结果生成view 试图

            具体 *** 作:ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View  进行渲染将处理结果通过页面展示给用户

7、view 是spring-mvc 的封装对象,是一个接口

springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

在阅读源码的过程中,发现在启动流程中,用到了适配器模式。。。。

适配器模式:大致对它的理解是这样的,假如现在有一个三方系统M,我们现在有个系统A需要和他交互,那么需要双方定义通信协议。那么问题来了,如果后期我们有很多系统都想于这个M来交互,那么都需要和M去定义通信协议,对于M来说,M会答应么?

解决方案:这个时候,我们来找一个C,来兼容所有的系统,而最后和M交互的只有C,其他系统想要和M交互,那么只需要和C交互在这里C就相当于我们的适配器,也及就是说适配各种系统的调用


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12145481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存