9. 处理未完成解析的节点
在解析某些节点的过程中,如果这些节点引用了其他一些未被解析的配置,会导致当前节点解析工作无法进行下去。对于这种情况,MyBatis的做法是抛出IncompleteElementException异常。外部逻辑会捕捉这个异常,并将节点对应的解析器放入 incomplet*集合中。
额外逻辑
1234567891011// -☆- XMLMapperBuilderpublic void parse() { // 省略部分代码 // 解析 mapper 节点 configurationElement(parser.evalNode("/mapper")); // 处理未完成解析的节点 parsePendingResultMaps(); parsePendingCacheRefs(); parsePendingStatements(); }
从上面的源码中可以知道有三种节点在解析过程中可能会出现不能完成解析的情况。由于上面三个以 parsePending 开头的方法逻辑一致,所以下面只会分析其中一个 ...
9. 基于 HTTP 的功能追加协议
消除 HTTP 瓶颈的 SPDYGoogle 在 2010 年发布了 SPDY(取自 SPeeDY,发音同 speedy),其 开发目标旨在解决 HTTP 的性能瓶颈,缩短 Web 页面的加载时间
HTTP 的瓶颈在 Facebook 和 Twitter等SNS网站上,几乎能够实时观察到海量用户公开发布的内容,这也是一种乐趣。当几百、几千万的用户发布内容时,Web网站为了保存这些新增内容,在很短的时间内就会发生大量的内容更新
为了尽可能实时地显示这些更新的内容,服务器上一有内容更新,就需要直接把那些内容反馈到客户端的界面上。虽然看起来挺简单的,但HTTP却无法妥善地处理好这项任。
使用HTTP协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,那么就会产生徒劳的通信。
若想在现有 Web 实现所需的功能,以下这些 HTTP 标准就会成为瓶颈。
一条连接上只可发送一个请求
请求只能从客户端开始
客户端不可以接收除响应以外的指令
请求 / 响应首部未经压缩就发送
首部信息越多延迟越大
发送冗长的首部
每次互相发送相同 ...
10. HandlerMapping 组件(四)之 AbstractUrlHandlerMapping
概述右半边红色部分
WebSocketHandlerMapping 是 spring-websocket 项目中的类
AbstractUrlHandlerMapping实现 MatchableHandlerMapping 接口,继承 AbstractHandlerMapping 抽象类,以 URL 作为 Handler 的 HandlerMapping 抽象类,提供 Handler 的获取、注册等等通用的骨架方法。
构造方法123456789101112131415161718192021222324/** * 根路径的处理器 */@Nullableprivate Object rootHandler;/** * 使用后置的 / 匹配 */private boolean useTrailingSlashMatch = false;/** * 是否延迟加载处理器 * * 默认,关闭。 */private boolean lazyInitHandlers = false;/** * 路径和处理器的映射 * * KEY:路径 {@link #lookupHandler ...
10. 更新语句执行过程全貌
执行更新语句所需处理的情况较之查询语句要简单不少,两者最大的区别更新语句的执行结果类型单一,处理逻辑要简单不少。除此之外,两者在缓存的处理上也有比较大的区别。更新过程会立即刷新缓存,而查询过程则不会。
execute我们还是从 MapperMethod 的 execute 方法开始看起
1234567891011121314151617181920212223242526272829303132333435// -☆- MapperMethodpublic Object execute(SqlSession sqlSession, Object[] args) { Object result; switch (command.getType()) { case INSERT: { // 执行插入语句 Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult( ...
10. Web 的攻击技术
针对 Web 的攻击技术简单的 HTTP 协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标
目前,来自互联网的攻击大多是冲着 Web 站点来的,它们大多把 Web 应用作为攻击目标
HTTP 不具备必要的���全功能几乎现今所有的 Web 网站都会使用会话(session)管理、加密处理等安全性方面的功能,而 HTTP 协议内并 不具备这些功能
从整体上看,HTTP 就是一个通用的单纯协议机制。因此它具备较多优势,但是在安全性方面则呈劣势。就拿远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及会话管理等功能,HTTP协议则没有。
因此,开发者需要自行设计并开发认证及会话管理功能来满足Web应用的安全。而自行设计就意味着会出现各种形形色色的实现。结果,安全等级并不完备,可仍在运作的Web应用背后却隐藏着各种容易被攻击者滥用的安全漏洞的Bug。
在客户端即可篡改请求在 Web 应用中,从浏览器那接收到的HTTP请求的全部内容,都可以在客户端自由地变更、篡改。所以 Web ...
11. HandlerAdapter 组件(一)之 HandlerAdapter
处理器适配器接口
1234567891011121314151617181920212223// HandlerAdapter.javapublic interface HandlerAdapter { /** * 是否支持该处理器 */ boolean supports(Object handler); /** * 执行处理器,返回 ModelAndView 结果 */ @Nullable ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; /** * 返回请求的最新更新时间。 * * 如果不支持该操作,则返回 -1 即可 */ long getLastModified(HttpServletRequest request, Object handler);}
因为,处理器 handl ...
11. 处理更新结果
更新语句的执行结果是一个整型值,表示本次更新所影响的行数。由于返回值类型简单,因此处理逻辑也很简单。
1234567891011121314151617181920212223// -☆- MapperMethodprivate Object rowCountResult(int rowCount) { final Object result; // 这里的 method 类型为 MethodSignature,即方法签名 if (method.returnsVoid()) { // 方法返回类型为 void,则不用返回结果,这里将结果置空 result = null; } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) { // 方法返回类型为 Integer 或 int,直接赋值返回即可 re ...
11. HTTP 2.0 概览
HTTP 2.0 在性能上实现了很大的飞跃,更难得的是它在改进的同时保持了语义的不变,与 HTTP 1.1的语义完全相同!
比如请求方法、URI、状态码、头字段等概念都保留不变,这样就消除了再学习的成本,在我们的日常软件升级中,向下兼容非常重要,也是促进产品大规模使用的一个前提,不然你一升级,各种接口之类的全换了,谁还敢升。
HTTP 2.0 只在语法上做了重要改进,完全变更了 HTTP 报文的传输格式
头部压缩HTTP 1.1 考虑了 body的压缩,但没有考虑header的压缩,经常出现传了头部上百,上千字���,但Body却只有几十字节的情况,浪费了带宽
而且我们知道从 1.1开始默认是长连接,几百上千个请求都用的这个连接,而请求的头部很多都是重复的,造成了带宽的极大浪费!
那么 HTTP 2.0 是如何解决的呢?它开发了专门的「HPACK」算法,在客户端和服务器两端建立字典,用索引号表示重复的字符串,还采用哈夫曼编码来压缩数字和整数,可以达到最高达 90% 的压缩率
维护一份静态的字典(Static table),包含常见的头部名称,以及特别常见的头部名称与值的组合。这 ...
12. HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod
类图
HandlerMethod处理器的方法的封装对象
InvocableHandlerMethod继承 HandlerMethod 类,可 invoke 调用的 HandlerMethod 实现类。
HandlerMethod 只提供了处理器的方法的基本信息,不提供调用逻辑。
构造方法123456789101112131415161718192021// InvocableHandlerMethod.java@Nullableprivate WebDataBinderFactory dataBinderFactory;private HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();public InvocableHandlerM ...