源码

从源码角度了解SpringMVC的执行流程

戏子无情 提交于 2020-01-11 18:53:35
目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMVC的执行流程   SpringMVC的执行流程网上有很多帖子都有讲解,流程图和文字描述都很详细,但是你如果没有通过具体源码自己走一遍流程,其实只是死记硬背。所以想开个帖子从源码角度再梳理一遍SpringMVC的执行流程,加深印象。 SpringMVC介绍   SpringMVC采用的是 前端控制器(Front Controller) + 各个业务处理器(Controller)来处理请求的。前端控制器来响应所有请求,通过一定的调度规则找到具体负责处理的业务处理器,并将请求委派给具体的业务处理器去执行业务逻辑,业务处理器返回给前端控制器模型数据model,最后前端控制器将model交给视图View进行渲染。 源码分析思路   看源码的同学可能往往会陷入一个怪圈,刚开始看可能还能看懂,等到一层一层点进去会越来越晕,让自己陷入了太多的细节中,而这些细节其实对主要流程并没有多大影响,然后就埋头研究。之后不得不又从头开始看,又让自己陷入了另一个细节。其实看源码开始时只是需要看一个大致的框架和思路,了解代码的大致执行流程,千万不要让自己陷入到细节的泥潭中

[集合]AbstractList源码解析(5.1)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-11 17:30:05
AbstractList是List的一个实现类,并且继承了AbstractCollection。 开发者可以实现该接口,进行扩展集合。 如果要实现不可修改的list,需要实现get和size方法; 如果要实现可修改的list,必须额外实现set方法,如果集合的大小也可以改变,还需要实现add和remove方法。 接下来对于一些重要方法进行讲解 add(E e) 添加元素到集合的末尾 public boolean add ( E e ) { add ( size ( ) , e ) ; return true ; } public void add ( int index , E element ) { throw new UnsupportedOperationException ( ) ; } public abstract int size ( ) ; add(E e)方法调用了add(int index, E element)和size,通过这可以知道如果这一方法没有被覆写,则直接抛出异常.因为add(size(),ze)这个add方法抛异常。另外,该方法调用了size方法,必须实现size方法 set(int index, E element) 在index位置设置元素element,覆盖原来的元素 public E set ( int index , E element

HashSet和TreeSet源码分析

好久不见. 提交于 2020-01-11 16:59:42
目录 HashSet底层 HashSet构造函数 HaseSet add分析 TreeSet底层 TreeSet构造函数 TreeSet add分析 HashSet底层 是一个HashMap,只不过HashMap里面每个key对应的value值都是一样的PRESENT private static final Object PRESENT = new Object(); HashSet构造函数 public HashSet() { map = new HashMap<>();//new HashSet实际上是new HashMap(); } HaseSet add分析 // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null;//add其实是在HashMap里put一个key,对一个的value是固定的PRESENT } TreeSet底层 是一个TreeMap,只不过HashMap里面每个key对应的value值都是一样的PRESENT private static final Object

nginx源码解析之常用数据结构

不问归期 提交于 2020-01-11 15:56:07
  1、基础数据结构(src/core目录)   1)ngx_list_t(ngx_list.h) typedef struct ngx_list_part_s ngx_list_part_t; // 描述链表的一个元素(数组) struct ngx_list_part_s { void *elts; // 数组的起始地址 ngx_uint_t nelts; // 数组当前已使用了多少容量 ngx_list_part_t *next; // 下一个链表元素ngx_list_part_t的地址 }; typedef struct { ngx_list_part_t *last; // 指向链表的最后一个数组元素 ngx_list_part_t part; // 链表的首个数组元素 size_t size; // 存储的每个数据的字节数必须小于或等于size ngx_uint_t nalloc; // 每个ngx_list_part_t数组的容量 ngx_pool_t *pool; // 链表中管理内存分配的内存池对象 } ngx_list_t; // 描述整个链表   相关接口:   ngx_list_create(): 创建新的链表。   ngx_list_init(): 初始化一个已有的链表。返回 NGX_OK 表示成功,返回 NGX_ERROR 表示失败。   ngx_list

Android拓展系列(6)--CM9源码下载和编译

为君一笑 提交于 2020-01-11 12:55:48
公司最近也开始基于android4.0 ICS修改框架了,公司的手机暂时不适合拿回家测试,也没有kernel的权限。 从个人的角度看,我手上现在有两部手机,一部是Htc G9 Aria,一部是Samsung I9100 Galaxys2,Cyanogenmod的开源代码都提供了对这些手机的驱动支持,并且能方便的编译打包,并安装到手机。 上一篇文章是android2.3的编译,已经过时,而且现在ubuntu已经升级到12.04,等等之类的,使我觉得非常有必要重新写一篇新的博客来展示最新的android怎么在最新的ubuntu上编译。 基于以上几点,下面我将基于galaxys2来演示如何编译cm9的源码并打包zip安装到手机。下面是我的参考文章: http://source.android.com/source/initializing.html http://forum.xda-developers.com/showthread.php?t=1552090 https://github.com/CyanogenMod/android 这些链接或多或少会有一些问题,从这些这些东西我整理出最简单最有效的一条编译之路,也许会很上面这些文章很多步骤和说法上不一致。 1.ubuntu12.04的选择 我第一次用x64的系统,发现配置环境的时候,会有很多种错误,后来我用32位的系统

C#文件操作源码 递归复制一个目录 递归删除文件 和 文件夹

纵然是瞬间 提交于 2020-01-11 11:18:04
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Common.Files { public class FileOperator { /// <summary> /// /// </summary> /// <param name="path">文件路径</param> /// <param name="encoding">编码</param> /// <returns>文件内容</returns> public string ReadFile(string path, System.Text.Encoding encoding) { string tempContent = ""; using (StreamReader sr = new StreamReader(path, encoding)) { tempContent = sr.ReadToEnd(); } return tempContent; } /// <summary> /// /// </summary> /// <param name="path">文件的路径</param> /// <param name="append">是否追加<

Mybatis-原生Mybatis原理源码分析篇

怎甘沉沦 提交于 2020-01-11 08:24:08
Mybatis框架概述 Mybatis是持久层的框架,它内部封装了jdbc,使开发的时候只需要关注sql语句本身,不需要话费精力去处理加载驱动、创建连接、创建statement等。下面我们也是通过一个实例来对它进行分析。 首先编写一个SqlMapConfig.xml ​ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置Mybatis的环境--> <environments default="mysql"> <!--配置mysql环境--> <environment id="mysql"> <!--配置事务类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,也就是连接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value=

lua源码阅读笔记与思路整理一

感情迁移 提交于 2020-01-11 03:41:41
由于工作需要用了很多年的lua编写各种逻辑处理模块,今天心血来潮,决定深入了解一下lua源码的实现,目的是方便自己的lua代码调试,省的每次都用print打印这种原始手段,本“长篇小说“ 主要弄懂以下的问题: 1 local , global, upvalue 的原理和实现,upvalue的查找和递归标记是什么? 2 Function是什么,执行过程如何,参数如何传递,怎么分配栈上空间? 3 循环结构的实现 4 模块的实现,closure是什么 5 各种元表的实现,基本类型的元表如何增加(lua内部职能给table加元表,number,string这些都需要外部增加) 6 各种库方法的实现,如debug, math, string, os库等,浏览一遍有个概念即可 7 判断和跳转的实现 8 钩子函数的实现和应用 9 报错是如何组织的,各项信息在哪里保存的,又如何获取? 10 lua常量是什么,为什么要共享同一份常量? 11 gc回收是什么,如何实现的,流程是什么? 12 table类型的存储和访问,分数组类型和哈希类型 万里执行始于足下:先从最简单的local变量开始: 一、主要流程先表述一下:解析lua语言,生成c代码 >>>>> 调用c代码 前面的各种函数调用封装,检测错误封装暂且不表,直接进入最终解析语法的开始函数这: f_parser(lua_State*L ,void*

ARM嵌入式开发——基础概念

自作多情 提交于 2020-01-11 01:19:54
文章目录 嵌入式Linux系统组成 嵌入式Linux系统的启动流程 uboot制作 uboot特点 uboot三大功能 硬件初始化功能 引导加载内核 为内核传递启动参数 uboot源码操作 嵌入式Linux系统组成 嵌入式Linux系统软件由三部分组成: BootLoader(uboot)裸板软件,初始化硬件+从闪存加载内核到内存并且启动内核+给内核传递启动参数,告诉内核根文件系统rootfs在什么地方。(上电运行,内核启动后结束) Linux内核(kernel):Linux系统7大功能,管理进程、管理内存、文件系统、设备控制、网络管理。掉电结束。 根文件系统(rootfs): bin:各种命令。 sbin:各种超级用户的命令。 lib:标准系统库。 etc:各种服务的配置(tftpd-hpa,nfs) dev:存放设备文件 sys:存放虚拟文件系统sysfs相关内容 proc:存放虚拟文件系统procfs相关内容 usr:存放其他命令 嵌入式Linux系统的启动流程 上电CPU运行uboot uboot根据bootcmd加载启动内核并且通过bootargs给系统传递参数。 内核启动,完成7大功能。 内核最后根据uboot传递的bootargs到某个地方找到根文件系统rootfs 一旦找到根文件系统rootfs,控制权交给根文件系统。 内核会运行第一号进程/sbin/init

SpringCache源码深度解析

早过忘川 提交于 2020-01-10 23:08:36
缓存是我们常用的一种优化系统的方案。 无论是前端缓存还是应用层缓存或者数据库缓存,其本质都是将查询过的数据缓存下来,下次再次查询该数据的时候如果数据没有过期,则直接返回缓存中该数据即可,不再执行查询操作。 SpringCache是我们常用的一种应用层缓存方案,其一般应用在方法上,下面我们先来看下具体的使用方式,然后再从源码角度分析其实现方案 1.SpringCache的使用 1)maven引入依赖 cache功能相关代码都在spring-context中,一般使用Spring的项目中都有该包,所以不用再单独引入 2)Service(业务处理类,代码参考网上文章,非原创,有改动) // 接口类 package cache; public interface IService { Account getAccountByName(String userName); void updateAccount(Account account); } // 实现类 public class AccountService implements IService{ @Override @Cacheable(value = "accountCache") // 使用了一个缓存名叫 accountCache public Account getAccountByName(String userName)