源码分析

SpringMVC架构设计分享

与世无争的帅哥 提交于 2019-12-01 09:13:18
根据大神的博客 SpringMVC深度探险系列 跟开涛学SpringMVC 消息转换器HttpMessageConverter 我自己的SpringMVC源码分析 这里的不全,可以到之前的地方查看 SpringMVC源码分析 加上自己看的源码,整理了一份SpringMVC架构设计的分享ppt,下载地址如下: SpringMVC架构设计的分享 来源: oschina 链接: https://my.oschina.net/u/2287728/blog/398853

zg手册 之 python2.7.7源码分析(1)-- python中的对象

牧云@^-^@ 提交于 2019-11-29 04:13:21
源代码主要目录结构 Demo: python 的示例程序 Doc: 文档 Grammar: 用BNF的语法定义了Python的全部语法,提供给解析器使用 Include: 头文件,在用c/c++编写扩展模块时使用 Lib: Python自带的标准库,用python编写的 Modules: 用c编写的内建模块的实现,zlib,md5 等 Objects: 内建对象类型的实现 list,dict 等 PC: windows 平台相关文件 PCbuild: Microsoft Visual C++ 项目工程目录 Parser: 对 Python 代码进行词法分析和语法分析的代码 Python: 字节码编译器和解释器 Tools: 一些用 Python 开发的工具 python 的对象定义和创建 在 python 中,一切都是对象 python 中的对象有定长对象PyObject (如 int 对象),变长对象PyVarObject(如 list 对象), Python 的对象都属于这两种之一。对象中包含引用计数和类型信息,管理和创建对象需要用到。还包含属性值的存储空间。 PyObject 对象在内存中的结构类似下面代码: // 在 Include/object.h 中 // 定长对象 typedef struct _object { int ob_refcnt; //

Mybatis3.3.x技术内幕(九):Mybatis初始化流程(中)

ぐ巨炮叔叔 提交于 2019-11-28 12:56:14
Mybatis初始化流程,其实就是组装重量级All-In-One对象Configuration的过程,主要分为系统环境参数初始化和Mapper映射初始化。 上一节中,粗略讲述了 Mybatis初始化的基本步骤,本节,将详细分析具体的初始化过程中的细节问题,细节决定成败。 1. Properties variables的作用 通常,我们会单独配置jdbc.properties文件,保存于 variables变量中, 而Xml文件内可以使用${driver}占位符,读取时可动态替换占位符的值。 String value = PropertyParser.parse(attribute.getNodeValue(), variables); Mybatis中的PropertyParser类,就是用来动态替换占位符参数的。 2. 扫描package <typeAliases> <typeAlias alias="Student" type="com.mybatis3.domain.Student" /> <typeAlias alias="Teacher" type="com.mybatis3.domain.Teacher" /> <package name="com.mybatis3.domain" /> </typeAliases> 前两个typeAlias,很容易理解,那么

Mybatis3.3.x技术内幕(七):Mybatis初始化之六个工具

喜夏-厌秋 提交于 2019-11-28 12:56:01
全民欢庆的五一劳动节,可谓是赏花赏月赏秋香的好季节,炎炎夏日,柳絮飞扬,短裙飞舞,低胸抢镜,是旅游撩妹裸奔等精彩活动的不二选择,不过,这显然与我无关。 终于要开启Mybatis的初始化过程分析了,是不是等的花儿都要开放了呢? 一般的框架分析思路都是从启动、初始化说起,然而,由于没有心理准备,初始化过程中会瞬间涌入大量的概念、类等等,类之间又存在爆炸性延伸,反而吓退了读者,有种吃不下这块肥肉的感觉。所以,我选择优先介绍一些易于理解的框架概念,然后再阅读和分析框架的启动和初始化流程,有了事先的精心准备,肥肉也就不再肥了。 我一直在反思,我的博文是否写的过长了,读者是否读的很累,是否没有描述清楚内容,是否没有抓住重点。因此,我大胆创新了博文的写作模式,叫 精炼博文 。 Mybatis的初始化过程,就是组装Configuration的过程,在这个过程中,用到了一些工具,我列举了六个基本工具,如图所示。 (Made In Edrawmax) 图中展示了XMLConfigBuilder为了组装出Configuration对象所作出的努力,配备了至少六个基本工具。本文的重点,就是分析这六个工具的作用。 好怕怕啊,一下子分析六个那么多。别怕,每个工具不超过三行代码,你就会彻底明白(相信你自己)。 1. ObjectFactory ObjectFactory objectFactory = new

Mybatis3.4.x技术内幕(十七):Mybatis之动态Sql设计原本(上)

匆匆过客 提交于 2019-11-28 12:55:32
上一篇博文中,介绍了可复用的sql片段,通过<include>标签进行引入,而<include>标签内一般存放的是静态sql,其实,sql片段也是可以放置动态sql标签内容。 1. Mybatis支持的动态sql及基本用法 org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.nodeHandlers(String)部分源码。 NodeHandler nodeHandlers(String nodeName) { Map<String, NodeHandler> map = new HashMap<String, NodeHandler>(); map.put("trim", new TrimHandler()); map.put("where", new WhereHandler()); map.put("set", new SetHandler()); map.put("foreach", new ForEachHandler()); map.put("if", new IfHandler()); map.put("choose", new ChooseHandler()); map.put("when", new IfHandler()); map.put("otherwise", new OtherwiseHandler(

Mybatis3.4.x技术内幕(十六):Mybatis之sqlFragment(可复用的sql片段)

冷暖自知 提交于 2019-11-28 12:53:49
Mybatis目前最新版本为3.4.0,因此,我也将我的项目由3.3.1替换为3.4.0。在上一篇博文中,详细分析了Mybatis在使用foreach循环进行批量insert,返回主键id列表时,如果使用BatchExecutor,那么由于Mybatis存在bug,返回的id列表将是null值。很遗憾的告诉大家,Mybatis3.4.0依然是没有修复该bug的,该bug依然存在。 今天,我们将分析Mybatis之sqlFragment,可以翻译为sql片段,它的存在价值在于可复用sql片段,避免到处重复编写。 在工作中,往往有这样的需求,对于同一个sql条件查询,首先需要统计记录条数,用以计算pageCount,然后再对结果进行分页查询显示,看下面一个例子。 <sql id="studentProperties"><!--sql片段--> select stud_id as studId , name, email , dob , phone from students </sql> <select id="countAll" resultType="int"> select count(1) from ( <include refid="studentProperties"></include><!--复用--> ) tmp </select> <select id=

java容器源码分析(五)——HashMap(续)

只谈情不闲聊 提交于 2019-11-28 10:31:42
续前一篇java容器源码分析(四)——HashMap,继续分析HashMap的源码。 containsValue(Object value): public boolean containsValue(Object value) { if (value == null) return containsNullValue(); Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true; return false; } 可以看出,这里对table做了一次线性遍历才能够获取出value,复杂度为O(n)。 再看一下Map遍历用到的方法entrySet() public Set<Map.Entry<K,V>> entrySet() { return entrySet0(); } private Set<Map.Entry<K,V>> entrySet0() { Set<Map.Entry<K,V>> es = entrySet; return es != null ? es : (entrySet = new EntrySet()); }

Mybatis3.3.x技术内幕(二):动态代理之投鞭断流(自动映射器Mapper的底层实现原理)

天涯浪子 提交于 2019-11-28 10:21:22
一日小区漫步, 我问朋友:Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口实例,并调用接口方法返回数据库数据,你知道为什么不?朋友很是诧异:是啊,我也很纳闷,我们领导告诉我们按照这个模式编写就好了,我同事也感觉很奇怪,虽然我不知道具体是怎么实现的,但我觉得肯定是……(此处略去若干的漫天猜想),但是也不对啊,难道是……(再次略去若干似懂非懂)。 这激发了我写本篇文章的冲动。 动态代理的功能:通过拦截器方法回调,对目标target方法进行增强。 言外之意就是为了增强目标target方法。上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有 投鞭断流 的霸权,连目标target都不要的科幻模式。 注:本文默认认为,读者对动态代理的原理是理解的,如果不明白target的含义,难以看懂本篇文章,建议先理解动态代理。 1. 自定义JDK动态代理之 投鞭断流 实现自动映射器Mapper 首先定义一个pojo。 public class User { private Integer id; private String name; private int age; public User(Integer id, String name, int age) { this.id = id; this.name = name; this.age =

Mybatis3.3.x技术内幕(八):Mybatis初始化流程(上)

坚强是说给别人听的谎言 提交于 2019-11-27 08:35:02
Mybatis初始化流程,其实就是组装重量级All-In-One对象Configuration的过程,主要分为系统环境参数初始化和Mapper映射初始化,其中Mapper映射初始化尤为重要。 inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return new DefaultSqlSessionFactory(parser.parse()); } parser.parse()方法,已经返回了组装完毕的 Configuration对象。 流程进入XMLConfigBuilder.parse()方法。 public Configuration parse() {

Mybatis3.3.x技术内幕(十):Mybatis初始化流程(下)

可紊 提交于 2019-11-27 08:34:36
Mybatis初始化过程中,解析parameterMap、resultMap、"select|insert|update|delete"元素,无疑是重头戏。本节将详细分析解析过程。 元素 parameterMap 将会解析为ParameterMap对象,该对象包含一个List<ParameterMapping>集合,是one-to-many关系。 元素 resultMap将会解析为ResultMap对象,该对象包含一个List<ResultMapping>集合, 是one-to-many关系 。 元素"select|insert|update|delete"将会被解析为MappedStatement对象,该对象包含了ParameterMap、 ResultMap等对象。 1. 解析 parameterMap元素 (Made In Visual Paradigm) MapperBuilderAssistant是一个通用构建Mapper辅助类。 ParameterMapping.Builder用于构建 ParameterMapping对象,而ParameterMap.Builder则用于构建 ParameterMap对象。 其中resolveTypeHandler()很重要,我们自定义的 TypeHandler要起作用,就靠该方法正确绑定 TypeHandler了,后续会单独开一篇关于