8. HandlerMapping 组件(二)之 HandlerInterceptor
HandlerInterceptor处理器拦截器接口
1234567891011121314151617181920212223242526272829// HandlerInterceptor.javapublic interface HandlerInterceptor { /** * 拦截处理器,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行之前 */ default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * 拦截处理器,在 {@link HandlerAdapter#handle(HttpSer ...
8. 内存回收(GC算法)
GC 算法这里讨论的是oracle的Hotspot VM常见的垃圾回收算法。使用的搜索算法都是基于根搜索算法实现的
标记-清除算法(Mark-Sweep)该算法分两步执行:
标记Mark:从GC ROOTS开始,遍历堆内存区域的所有根对象,对在引用链上的对象都进行标记。这样下来,如果是存活的对象就会被做了标记,反之如果是垃圾对象,则没做有标记。GC很容易根据有没有被做标记就完成了垃圾对象回收。
清除Sweep:遍历堆中的所有的对象(标记阶段遍历的是所有根节点),找到未被标记的��象,直接回收所占的内存,释放空间。
优点
没有产生额外的内存空间消耗,内存利用率高。
缺点
效率低,清除阶段要遍历所有的对象;回收的垃圾对象是在各个角落的,直接回收垃圾对象,导致存在不连续的内存空间,产生内存碎片。
标记-清除算法操作的对象是【垃圾对象】,对于活着的对象(被标记的对象),它则直接不理睬。
复制算法(Copying)复制算法把内存区间一分为二,有对象存在的一半区间称为“活动区间”,没有对象存在处于空闲状态的空间则为“空闲区间”。
当内存空间不足时触发GC,先采用根搜索 ...
8. 关联查询和延迟加载
我们在学习 MyBatis 框架时,会经常碰到一对一,一对多的使用场景。对于这样的场景,通常我们可以用一条 SQL 进行多表查询完成任务。当然我们也可以使用关联查询,将一条SQL 拆成两条去完成查询任务。MyBatis 提供了两个标签用于支持一对一和一对多的使用场景,分别是和。
关联查询12345678910111213141516171819/** 作者类 */public class Author { private Integer id; private String name; private Integer age; private Integer sex; private String email; // 省略 getter/setter}/** 文章类 */public class Article { private Integer id; private String title; // 一对一关系 private Author author; private Stri ...
8. Mapper 接口绑定过程分析
映射文件解析完成后,并不意味着整个解析过程就结束了。此时还需要通过命名空间绑定 mapper 接口,这样才能将映射文件中的 SQL 语句和 mapper 接口中的方法绑定在一起,后续可直接通过调用 mapper 接口方法执行与之对应的 SQL 语句。
mapper 接口的绑定过程
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051// -☆- XMLMapperBuilderprivate void bindMapperForNamespace() { // 获取映射文件的命名空间 String namespace = builderAssistant.getCurrentNamespace(); if (namespace != null) { Class<?> boundType = null; try { // 根据命名空间解析 ma ...
8. 解析typeHandlers节点
在向数据库存储或读取数据时,我们需要将数据库字段类型和 Java 类型进行一个转换。比如数据库中有 CHAR 和 VARCHAR 等类型,但 Java 中没有这些类型,不过 Java 有 String类型。所以我们在从数据库中读取 CHAR 和 VARCHAR 类型的数据时,就可以把它们转成String。
在 MyBatis 中,数据库类型和 Java 类型之间的转换任务是委托给类型处理器TypeHandler 去处理的。MyBatis 提供了一些常见类型的类型处理器,除此之外,我们还可以自定义类型处理器以非常见类型转换的需求。
实例123456789101112<!-- 自动扫᧿ --><typeHandlers> <package name="xyz.coolblog.handlers"/></typeHandlers><!-- 手动配置 --><typeHandlers> <typeHandler jdbcType="TINYINT" ...
8. 确认访问用户身份的认证
某些 Web 页面只想让特定的人浏览,或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。
何为认证计算机本身无法判断坐在显示器前的使用者的身份,为了弄清究竟是谁在访问服务 器,就得让对方的客户端自报家门。
核对的信息通常是指:
密码:只有本人才会知道的字符串信息
动态令牌:仅限本人持有的设备内显示的一次性密码。
数字证书:仅限本人(终端)持有的信息
生物认证:指纹和虹膜等本人的生理信息
IC 卡等:仅限本人持有的信息。
HTTP 使用的认证方式HTTP/1.1 使用的认证方式
BASIC 认证(基本认证)
DIGEST 认证(摘要认证)
SSL 客户端认证
FormBase 认证(基于表单认证)
BASIC 认证BASIC 认证(基本认证)是从HTTP/1.0就定义的认证方式。即便是现在仍有一部分的网站会使用这种认证方式。
认证步骤
当请求的资源需要 BASIC 认证时,服务器会随状态码 401 Authorization Required,返回带 WWW-Authenticate 首部字段的响应。 该字段内包含认证的方式(BASIC ...
8. redis 持久化
Redis 的持久化则是将内存中的数据持久备份到硬盘中,在服务重启时可以恢复。Redis 目前提供了两种持久化方式:
RDB,即 Redis DataBase:把 Redis 服务器中内存的数据保存到一个 dump 文件中,数据的集合
AOF,即 Append-only file:把所有对 Redis 服务器进行修改的命令保存到一个 aof 文件中,命令的集合
RDB即 Redis 的内存快照,它是在某一个时间点将 Redis 的内存数据全量写入一个临时文件,当写入完成后,用该临时文件替换上一次持久化生成的文件,这样就完成了一次持久化过程
123456789101112131415161718# dbfilename:持久化数据存储在本地的文件dbfilename dump.rdb# dir:持久化数据存储在本地的路径,如果是在/redis/src下启动的redis-cli,则数据会存储在当前src目录下dir ./## snapshot触发的时机,save <seconds> <changes> ## 一般来说我们需要根据系统变更操作密集程度来认真 ...
9. HandlerMapping 组件(三)之 AbstractHandlerMethodMapping
概述右半边黄色的部分
注解123456org.springframework.web.bind.annotation.@RequestMappingorg.springframework.web.bind.annotation.@GetMappingorg.springframework.web.bind.annotation.@PostMappingorg.springframework.web.bind.annotation.@PutMappingorg.springframework.web.bind.annotation.@DeleteMappingorg.springframework.web.bind.annotation.@PatchMapping
AbstractHandlerMethodMapping实现 InitializingBean 接口,继承 AbstractHandlerMapping 抽���类,以 Method 作为 Handler 的 HandlerMapping 抽象类,提供 Mapping 的初始化、注册等通用的骨架方法。这就是我们常说 ...
9. 内存回收(GC日志及工具)
GC日志查看可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略
GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空
对应的参数列表
123456-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息-Xloggc:../logs/gc.log 日志文件的输出路径
指标监控GC在于判断JVM是否在良好高效地工作并且是否需要投入性能调优(主要包括应用程序优化与JVM参数优化),关注的数据大概有:
Mirror GC频率、持续时间以及回收内存量。
Major GC频率、持续时间、回收内存量以及 stop-the-world 耗时。
Hea ...
9. 存储映射结果
存储映射结果是“查询结果”处理流程中的最后一环,实际上也是查询语句执行过程的最后一环。
映射结果存储逻辑
12345678910111213141516171819private void storeObject(ResultHandler<?> resultHandler, DefaultResultContext<Object> resultContext,Object rowValue, ResultMapping parentMapping, ResultSet rs) throws SQLException { if (parentMapping != null) { // 多结果集相关,不分析了 linkToParents(rs, parentMapping, rowValue); } else { // 存储结果 callResultHandler(resultHandler, resultContext, rowValue ...