带着萌新看springboot源码04
继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了。
这次说一下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的更多相关文章
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- 带着萌新看springboot源码05
上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...
- 带着萌新看springboot源码8(spring ioc源码上)
emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...
- 带着萌新看springboot源码03
上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...
- 带着萌新看springboot源码12(启动原理 下)
先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...
- 带着萌新看springboot源码11(springboot启动原理 源码上)
通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...
- 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)
上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...
- 带着萌新看springboot源码09(springboot+JdbcTemplate)
emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...
- 带着萌新看springboot源码8(spring ioc源码下)
继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...
随机推荐
- flask 中使用 socket 遇到的坑
很久没用博客园了,最近涉及到一个问题,需要向前端推送日志 考虑的方案两个,一个是定时ajax 但是这样效率太慢了,二是用socket 那看看有没有轮子咯,面向百度编程,有两个库可以使用 1.flask ...
- C++类第五课:类的使用(三)[个人见解]
继承既然已经知道了是什么意思了,下面我们来学封装! 什么是封装?我们来举个例子: 1.你不能随意挥霍父母的血汗钱,血汗钱是作为他们的私有财产,而父母因为某些原因会主动给你,你才能用的舒心,否则父母不会 ...
- 二维数组的最大子数组和 时间复杂度:O(n的四次方)
先上代码 小组成员:高达,李奔 package 三月二十一号; import java.io.BufferedReader; import java.io.FileReader; import jav ...
- javascript中的函数节流和函数去抖
带着问题去尝试 首先我们要知道为什么要用到函数节流和函数去抖?我们带着以下的疑问来进行分析! 1.比如搜索框,你会用到什么事件(change.blur.keyup等)?去做什么效果?2.再比如scro ...
- 三、糖醋鲤鱼(Sweet and sour carp)
糖醋鲤鱼是用鲤鱼制作的一道山东济南传统名菜,为鲁菜的代表菜品之一 ,色泽金黄,外焦内嫩,酸甜可口,香鲜味美. 菜品历史 <诗经>载:岂食其鱼,必河之鲤.<济南府志>上早有&qu ...
- easyui-combotree选中指定的值
选中根节点: //station_id为combotree控件id var station = $('#station_id').combotree('tree').tree('getRoots'); ...
- verilog中timescale
1. `timescale `timescale是Verilog中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的`timescale指令或者`resetall指令.它的语 ...
- Java script 逻辑运算符
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a 1.只要“&&”前面是false,无论“&& ...
- python语法_函数
---恢复内容开始--- 函数: 1 减少重复代码 2 定义一个功能,需要直接调用 3 保持代码一致性 def funcation_name(参数s): 功能代码块0 参数可以为多个,传入时按照前后 ...
- JS HTML DOM代码(1)
<!DOCTYPE html> <html> <style type="text/css"> #容器 { width: 400px; heigh ...