12. SQL 执⾏过程总结
MyBatis 中,SQL 执行过程的实现代码是有层次的,每层都有相应的功能。比如:
SqlSession 是对外接口的接口,因此它提供了各种语义清晰的方法,供使用者调用。
Executor层做的事情较多,比如一二级缓存功能就是嵌入在该层内的。
StatementHandler 层主要是与JDBC 层面的接口打交道。
ParameterHandler 负责向 SQL 中设置运行时参数,是StatementHandler辅助类。
ResultSetHandler 负责处理 SQL 执行结果,是StatementHandler辅助类。
Configuration 是一个全局配置类,很多地方都依赖它。
MappedStatement 对应 SQL 配置,包含了 SQL 配置的相关信息
BoundSql 中包含了已完成解析的 SQL 语句,以及运行时参数等。
到此,关于 SQL 的执行过程就分析完了。
12. 总结HTTP特点
灵活可扩展这可以说是 HTTP 最重要的特点,也是HTTP能大行其道并碾压其他协议称霸于世的根本原因!它只规定了报文的基本格式,用空格分隔单词,用换行分隔字段,「header+body」等基本语义
但在语法层面并不做限制,它并没有强制规定header里应该传什么,也没有限制它底层应该用什么传输,这也为HTTPS添加SSL/TLS层来加密传输,HTTP2使用帧,流来进行多路复用,HTTP3使用UDP彻底解决解决队头阻塞问题提供了可能!后续如果又出现了牛逼的协议,底层也随时可以替换
可靠传���不管底层是 TCP 还是QUIC(底层使用UDP),它们的传输都是可靠的,都能保证应用层请求响应的可靠传输,这一点很重要,不然传输过程中缺胳膊少腿,应用层就无法解析了。
应用层协议HTTP 是一个协议,很多人把 HTTP 和 TCP 混在了一起
TCP 相当于高速公路,为我们提供了可靠的传输通道
HTTP 规定货物的表现形式(header + 空行+ body)
货物是否可从中间站运回(缓存机制)高速公路是否应该关闭(连接控制),至于货物如何可靠传输到目的地,那是 TCP 的 ...
13. HandlerAdapter 组件(三)之 HandlerMethodArgumentResolver
概述HandlerMethodArgumentResolver ,HandlerMethod 的参数解析器接口
1234567891011121314151617181920212223242526272829303132333435public interface HandlerMethodArgumentResolver { /** * 是否支持解析该参数 * * Whether the given {@linkplain MethodParameter method parameter} is * supported by this resolver. * @param parameter the method parameter to check * @return {@code true} if this resolver supports the supplied parameter; * {@code false} otherwise ...
13. 问题解析
为什么说反爬是个伪命题因为不管是正常的客户端请求,还是爬虫请求,都要遵循HTTP协议,爬虫发的 HTTP报文与正常用户请求没有本质区别,服务器无法区分
服务器只能通过一些trick,如短时间内发现某个ip的请求特别频繁认定其为爬虫,直接拒绝服务,或者通过验证码的方式等提高爬虫的难度,但无法彻底杜绝
爬虫也有应对之道,它可以在请求的时候不停地更换自己的 ip 以达到欺骗 server 的目的,也可以破解验证码
爬虫和反爬也是在相爱相杀中不断提高破解与被破解的手段了
301 与 302 有啥区别
输入 A 网址后,会重定向到 B 网址,就需要考虑是用 301 还是 302,两者的区别如下:
301:代表永久重定向
第一次请求拿到长链接后,下次浏览器再去请求短链的话,不会向短网址服务器请求了,而是直接从浏览器的缓存里拿,这样在 server 层面就无法获取到短网址的点击数
如果这个链接刚好是某个活动的链接,也就无法分析此活动的效果。所以我们一般不采用 301。
302:代表临时重定向
每次去请求短链都会去请求短网址服务器(除非响应中用 Cache-Control 或 Expir ...
14. HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
类图
HandlerMethod处理器的方法的封装对象
InvocableHandlerMethod继承 HandlerMethod 类,可 invoke 调用的 HandlerMethod 实现类。
HandlerMethod 只提供了处理器的方法的基本信息,不提供调用逻辑。
构造方法123456789101112131415161718192021// InvocableHandlerMethod.java@Nullableprivate WebDataBinderFactory dataBinderFactory;private HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();public InvocableHandlerM ...
15. HandlerAdapter 组件(五)之 HttpMessageConverter
在 Spring MVC 中,可以使用 @RequestBody 和 @ResponseBody 两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring 3.x 中新引入的 HttpMessageConverter ,即消息转换器机制。
Http 请求的抽象,还是回到请求-响应,也就是解析请求体,然后返回响应报文这个最基本的 Http 请求过程中来。我们知道,在 Servlet 标准中,可以用javax.servlet.ServletRequest 接口中的以下方法:
1public ServletInputStream getInputStream() throws IOException;
得到一个ServletInputStream。这个 ServletInputStream 中,可以读取到一个原始请求报文的所有内容。同样的,在 javax.servlet.ServletResponse 接口中,可以用以下方法:
1public ServletOutputStream getOutputStream() throws IO ...
17. RequestToViewNameTranslator 组件
概述请求到视图名的转换器接口
123456789public interface RequestToViewNameTranslator { /** * 根据请求,获得其视图名 */ @Nullable String getViewName(HttpServletRequest request) throws Exception;}
在 DispatcherServlet 中,我们已经看到,在 ModelAndView 不存在对应的视图时,会通过 RequestToViewNameTranslator 来获取默认的视图名,作为其视图。
DefaultRequestToViewNameTranslator实现 RequestToViewNameTranslator 接口,默认且是唯一的 RequestToViewNameTranslator 实现类。
构造方法1234567891011121314151617181920212223242526272829303132333435// DefaultRequestToViewNameTransla ...
18. LocaleResolver 组件(国际化)
LocaleResolverLocaleResolver 是一个解决国际化的策略接口。它包含两个方法:
resolveLocale
setLocale
1234567public interface LocaleResolver { Locale resolveLocale(HttpServletRequest request); void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);}
类图
AcceptHeaderLocaleResolverSpringMVC 默认使用的是:AcceptHeaderLocaleResolver 。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646 ...
19. ThemeResolver 组件
类图
ThemeResolver接口 ThemeResolver 中定义的接口是比较简单的,提供两个接口:
resolveThemeName 获取样式名
setThemeName 设置样式名
12345678910111213141516171819202122232425public interface ThemeResolver { /** * 从请求中,解析出使用的主题。例如,从请求头 User-Agent ,判断使用 PC 端,还是移动端的主题 * * Resolve the current theme name via the given request. * Should return a default theme as fallback in any case. * @param request request to be used for resolution * @return the current theme name */ String resolveThemeName(HttpServletRequest re ...
20. ViewResolver 组件
概述实体解析器接口,根据视图名和国际化,获得最终的视图 View 对象。代码如下:
1234567891011// ViewResolver.javapublic interface ViewResolver { /** * 根据视图名和国际化,获得最终的 View 对象 */ @Nullable View resolveViewName(String viewName, Locale locale) throws Exception;}
类图
初始化我们以默认配置的 Spring Boot 场景下为例,来一起看看 DispatcherServlet 的 #initViewResolvers(ApplicationContext context) 方法,初始化 viewResolvers 变量。代码如下
1234567891011121314151617181920212223242526272829303132333435363738394041424344// DispatcherServlet.java/** List of ViewRe ...