目录
2. 根据这个架构写出一个MyBatis的1.0版本Demo
5. 查看MyBatis源码中的各模块代码,查看相互联系和代码实现
一、 我是如何看源码的
看框架原码是提高代码设计能力的一个重要的途径。通过学习大牛的优秀代码和设计思想,我们既能够更深地理解框架的底层原理,又能够强化代码的架构能力。
但是开源框架通常都是比较大的项目,盲目地一头扎到代码中去逐行看,可能会摸不着头脑,没有成就感,而一点点地耗尽热情,最终收效甚微。
我的建议是—— 先抓梗概,后看模块,带着问题看代码。
我通常的做法是:
1. 在看源码之前,设想如果自己来设计这个框架的话会怎么写。
根据框架的功能和暴露的接口,写一个小Demo, 可以写的很简单,接口里甚至只打印一句话都行,关键是思考着对框架进行分层和功能模块划分,只实现最核心的逻辑。
这样能让自己提起好奇心,以便看代码时不会倦怠。同时这是自己设计能力的一个答卷,后面将对照着标准答案(真实的框架代码设计情况)进行评判,找到自己的不足和更好的优化方式。
2. 先看框架梗概,不陷入具体细节,列出整个框架的骨架图和各模块之间的关系;之后再按功能看各个模块的代码实现。
过早地陷入代码细节,会导致只见树木不见森林;先搭好骨架再去填充细节要相对容易得多。
3. 看完代码之后按真实的框架再写一个demo,前面写的demo哪个地方不好?该怎样优化?
不懂的地方可以猜测再debug一下。
多问些关键问题,找关键类联系起来。
二、MyBastis架构
我们以MyBastis为例来看一下框架源码。
1. 预先分析一下MyBatis的骨架
我们先看一下MyBatis的常用例子:
SqlSession session = null;
try{
//创建SessionFactory对象,读取配置信息
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(
Resources.getResourceAsStream("mybatis-config.xml"));
//创建一个session
session = factory.openSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//Mybatis通过mapper代理直接执行查询方法
Person person= personMapper.selectOne(1001);
System.out.println(person);
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(null != session){
session.close();
}
}
从这些应用信息来看,我们能知道MyBatis:
(1)要有一个Configuration类,负责解析xml配置文件, 将相应的配置读进来并存储到Map中,包括DB相应的配置、包名.类名.方法名 与SQL语句之间的转换配置、以及其他的配置等。
(2)Session类, 要建立与DB的连接,根据调用的情况执行相应的SQL语句并返回相应的结果;如果Session类的功能太多会导致耦合,不妨将与DB打交道的功能单独封装到一个Executor类中(至于叫什么无所谓)。
(3)Session类需要提供一个getMapper() 方法, 根据类名生成相应的代理来调用想要的方法,肯定要用到动态代理,再封装一个动态代理类MapperProxy。
至于SessionFactory和SessionFactoryBuilder不属于核心功能,后续再去添加。
这些是最基本的骨架,我们根据这些基本的功能来搭建MyBatis的1.0版本的Demo。