设为首页 收藏本站
查看: 755|回复: 0

[经验分享] mybatis源码阅读心得

[复制链接]
发表于 2016-11-25 03:38:49 | 显示全部楼层 |阅读模式
2014/08/28更新
在github上fork了一个mybatis源码中文注释版,方便大家学习。

    最近研读了一下mybatis3的源码,这个框架本身相对其他框架还是比较简单的。因为他上手快,一般没接触过的童鞋一天之内看看官方那个中文文档就能上手。现在读源码,觉得代码也比较清晰,虽然注释很少,但代码都是自解释的。

1.mybatis中的设计模式

  • 工厂模式SqlSessionFactory/ObjectFactory/MapperProxyFactory
  • 建造模式SqlSessionFactoryBuilder/XMLConfigBuilder/XMLMapperBuilder/XMLStatementBuilder/CacheBuilder,Environment,把建造的步骤分装到一个类里,且运用了fluent API模式。
  • 单例模式LogFactory,这个简单,不许new多个实例
  • 合成模式MixedSqlNode,里面有许多孩子,TextSqlNode,ForEachSqlNode,IfSqlNode....
  • 装饰模式Cache,一个个缓存类通过一个链条串起来
  • 代理模式MapperProxy/ConnectionLogger,用的jdk的动态代理还有executor.loader包使用了cglib或者javassist达到延迟加载的效果
  • 模板方法模式BaseExecutor,具体方法实现交给子类SimpleExecutor/CachingExecutor做。还有BaseTypeHandler底下有各种子类如IntegerTypeHandler
  • 迭代器模式PropertyTokenizer,可以解析person[0].birthdate.year这样的字符串
  • 适配器模式,logging包统一了各大日志框架的接口


2.mybatis中的拦截器
有jdk的动态代理(Plugin),
cglib/javassist(executor.loader包)

3.mybatis中的缓存
代码设计的不错的。采用装饰模式,一个个包装起来,形成一个链,典型的就是SynchronizedCache->LoggingCache->SerializedCache->LruCache->PerpetualCache,通过链起来达到功能增加

  • SynchronizedCache 同步缓存,防止多线程问题。核心: 加读写锁,    ReadWriteLock.readLock().lock()/unlock()
        ReadWriteLock.writeLock().lock()/unlock()
  • LoggingCache 日志缓存,添加功能:取缓存时打印命中率
  • SerializedCache 序列化缓存 用途是先将对象序列化成2进制,再缓存
  • LruCache 最近最少使用缓存,核心就是覆盖 LinkedHashMap.removeEldestEntry方法,返回true或false告诉 LinkedHashMap要不要删除此最老键值。LinkedHashMap内部其实就是每次访问或者插入一个元素都会把元素放到链表末尾,这样不经常访问的键值肯定就在链表开头啦。
  • PerpetualCache 永久缓存,一旦存入就一直保持,内部就是一个HashMap,所有方法基本就是直接调用HashMap的方法
  • FifoCache 先进先出缓存,内部就是一个链表,将链表开头元素(最老)移除
  • ScheduledCache 定时调度缓存, 目的是每一小时清空一下缓存
  • SoftCache 软引用缓存,核心是SoftReference
  • WeakCache 弱引用缓存,核心是WeakReference
  • TransactionalCache 事务缓存,一次性存入多个缓存,移除多个缓存


4.mybatis中的插件
XMLConfigBuilder.pluginElement()解析plugins节点,调用Configuration.addInterceptor(),加入到Configuration里的InterceptorChain(拦截器链)。

这样下次ParameterHandler|ResultSetHandler|StatementHandler|Executor执行前就会调用plugin.invoke方法了,而他又会调用Interceptor.intercept,我们可以在这里实现自己的插件。替换这4个类的功能。核心就是jdk的动态代理。

5.mybatis中的日志
自己搞了个日志框架,其实就是统一了各大日志框架的接口,适配器模式吧。
mybatis会按以下顺序依次找有没有这个日志类,找到就用这个日志

  • SLF4J
  • Apache Commons Logging
  • Log4J2
  • Log4J
  • JDK logging


6.mybatis中的OGNL

  • foreach元素解析<foreach item="item" index="index" collection="list"
        open="(" separator="," close=")">
        #{item}
    </foreach>
    其中collection的解析核心是ognl
  • if元素解析  <if test="title != null">
        AND title like #{title}
      </if>
    整个test里面的字符串就交给ognl来解析


    本来想写点源码剖析的文章的,但本人文笔较差,发觉读代码累,写出来让大家看懂更累。就这么简单整理一下吧。个人感觉想提高自己还是自己静下心来研读代码比较好啊。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304980-1-1.html 上篇帖子: mybatis 系列五:mybatis-generator mybatis代码生成 工具修改 下篇帖子: 教你使用MyBatis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表