继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了。

  这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 。

1.梳理一下springmvc的大概流程

  首先是客户端(浏览器)发送请求到前端控制器(dispatcherServlet)-------------->前端控制器就会去调用处理器映射器(HandlerMapping),去寻找真正的Handler(其实就是controller),返回执行器链(HandlerExecutionChain,本质上就是目标Handler和一些拦截器组成的)给前端控制器----------->前端控制器就去调用处理器适配器(HandlerAdapter)去执行这个Handler,返回模型数据和视图(ModelAndView)给前端控制器------------->前端控制器从ModelAndView中获取逻辑视图(可以理解为controller返回的字符串),前端控制器调用视图解析器(ViewResolver)找到真正的视图(可以理解为就是加了一个前后缀,例如上节将的去类路径下找 “/template/xxx.html”)-------------->将真正的视图返回到前端控制器------------>模板引擎去渲染解析真正的视图响应客户端(ssm中就是去把里面写的jsp标签内容以及html标签内容,都变成servlet,编译成字节码文件,运行,然后响应客户端)

2.springboot的流程

  其实吧,springboot暂时可以理解为ssm中的springmvc+spring,虽然说这个理解不准确,但是有助于理解,不然脑中就只有一个印象:springboot很牛逼,做web应用特快,不需要配置,还是一个框架。。emmmm.....

   所以,以前springmvc配置的东西,springboot里面也有,前端控制器,映射器,适配器,视图解析器等在springboot中也有,就看你会不会找。(不用想,肯定在那xxxAutoConfiguration中!不然加载那么多自动配置类吃多了啊....)

  好,第一步,我们先来找找前端控制器,在那些自动配置类中,有个叫做DispatcherServletAutoConfiguration,打开这个类(ctrl+鼠标左键,嘿嘿)

  打开DispatcherServlet这个类的doDispatcher方法

  到这里,就完成一部分了,再之后,ModelAndView返回到前端控制器,我们再来看看视图解析器

 

  打开这个配置类,并找到视图解析器的组件

接下来,我们就看看上图中 ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();这里是如何设置视图解析器的。打开这个类并找方法initServletContext(获取容器中的所有视图解析器,这点很是关键,那是不是我写一个视图解析器放进容器,在这里是不是也会取到呢?答案当然是可以取到,这也是后面我们自己定制一个视图解析器的方法,而且,从这里可以看到,我们要自己定制一个组件,只需要实现相应组件的接口,然后丢到容器里就可以了,是不是很简单!)

  viewResolver这个集合肯定很有用,果然,后面马上就用到了

  到这里,大概的过程就走了一遍了,后面的就是模板引擎去渲染页面响应了,没什么说的,具体的还是要自己走走源码就差不多了(估计不会去走源码,咳咳)。

  其实说了这么多,大家也发现了,暂时springboot重点就是那些xxxAutoConfiguration,有了这些自动配置类,才能让我们去关注逻辑,而不是那些机械化的配置。

  下一节就说说我们往这些组件添加更多功能,因为由于一些特殊原因,springboot自动配置的功能不能满足我们的要求。或者干脆了说,我们想要把springboot某个组件替换掉,用我们自己写的组件,多好。

带着萌新看springboot源码04的更多相关文章

  1. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  2. 带着萌新看springboot源码05

    上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...

  3. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  4. 带着萌新看springboot源码03

    上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...

  5. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  6. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  7. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  8. 带着萌新看springboot源码09(springboot+JdbcTemplate)

    emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...

  9. 带着萌新看springboot源码8(spring ioc源码下)

    继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...

随机推荐

  1. Android Studio 重写方法时参数命名异常

    Android Studio 重写方法时参数命名异常 Android Studio 重写方法时参数名称乱掉可以通过下载相应源码解决

  2. tensorflow 使用 3 模型学习

    模型学习 import tensorflow as tf import numpy as np # 生成 100 个随机的点 x_data = np.random.rand( 100 ) y_data ...

  3. U-Boot内存管理

    如<Linux内核内存管理架构>一文中提到,linux内核中的内存管理支持内存地址映射.内存分配.内存回收.内存碎片管理.页面缓存等众多功能.但U-Boot做为启动引导程序,其核心功能就是 ...

  4. c++链表基本操作

    #include <stdlib.h> #include <malloc.h> #include <stdio.h> typedef struct Node { i ...

  5. python爬取网页内容demo

    #html文本提取 from bs4 import BeautifulSoup html_sample = '\ <html> \ <body> \ <h1 id = & ...

  6. Android完全退出应用的方法

    退出程序 public static void exitApp(Context context){ ActivityManager activityManager = (ActivityManager ...

  7. VIM常用快捷键(转载)

    移动光标 h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标点或单词分割 ...

  8. javascript基础(Array)

    1,join() Array.join(),不改变原数组,将数组中所有元素转换为字符串并连接在一起,返回最后生成的字符串 let a=[1,2,3]; a.join(); // =>" ...

  9. java中List<Map<String, Object>>关于null的判断

    List<Map<String, Object>> selectTmFileInfo = fileInfoService.selectTmFileInfoByToken(cTo ...

  10. window server 2008 安装Oracle10g

    oracle安装都大同小异. 开始安装步骤 输入完之后点击下一步 这时候稍等一会儿. 这时候也要稍等一会儿. 直接安装. 设置口令管理,设置SCOTT的密码为tiger就好了. 这时候稍等一会儿. o ...