`
C_J
  • 浏览: 127840 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis_2.3源码水平浅析(待续)

阅读更多

题记:

    总得开个头吧。前一篇垂直分析

 

客户端初始化

 

Reader reader=null;
SqlMapClient sqlMap=null; 
Reader =com.ibatis.common.resources.Resources.getResourceAsReader (filename);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();

 

    com.ibatis.common.resources.Resources.getResourceAsReader (filename);的方法是从当前ClassLoader里或SystemLoader里去加载名为filename的文件,并创建InputStreamReader返回。这里提下ClassLoader,JVM有Bootstrap,Ext,App的ClassLoader,用户类一般用AppClassLoader,会用Thread.getContextClassLoader()取到。关键代码如下:

  private static ClassLoader getClassLoader() {// 取ContextClassLoader
    return Thread.currentThread().getContextClassLoader();
  }
 public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
    InputStream in = null;
    if (loader != null) in = loader.getResourceAsStream(resource);
    if (in == null) in = ClassLoader.getSystemResourceAsStream(resource);
    if (in == null) throw new IOException("Could not find resource " + resource);
    return in;
  }

 

    构建SqlMapConfigParser来做初始化工作,初始化Variables,NodeletParser(The NodeletParser is a callback based parser similar to SAX),新建SqlMapExecutorDelegate(主要执行类),SqlMapClientImpl(delegate代理类,并处理线程安全)。关键代码如下:

 

 public SqlMapConfigParser() {
    this(null, null);
  }
  public SqlMapConfigParser(XmlConverter sqlMapConfigConv, XmlConverter sqlMapConv) {
    super(new Variables());
    parser.setValidation(true);
  parser.setEntityResolver(new SqlMapClasspathEntityResolver());// 把有关DTD的东西放到一个private static HashMap里叫doctypeMap。

    vars.sqlMapConfigConv = sqlMapConfigConv;
    vars.sqlMapConv = sqlMapConv;
    vars.delegate = new SqlMapExecutorDelegate();
    vars.typeHandlerFactory = vars.delegate.getTypeHandlerFactory();
    vars.client = new SqlMapClientImpl(vars.delegate);
    registerDefaultTypeAliases(); // 调用typeHandlerFactory,关联关键类类型

    addSqlMapConfigNodelets();
    addGlobalPropNodelets();
    addSettingsNodelets();
    addTypeAliasNodelets();
    addTypeHandlerNodelets();
    addTransactionManagerNodelets();
    addSqlMapNodelets();
    addResultObjectFactoryNodelets();
  }

 

    在这里SqlMapExecutorDelegate()初始化是重点,他需要初始化XML-CONFIG中所有的关键数据,并且存储和处理由NodeletParser来做。

 

XML配置文件解析思路

    ibatis解析XML是的DOM模型,NodeletParser实现了一个类似以"/Father/Child"字符串为key,匿名new Nodelet()类为value(匿名Nodelet类定义好自己的 public void process(Node node)方法)的回调函数 。当在解析XML的时候,根据当前解析到的某个node,并取得node的getNodeName,getAttributes,getChildNodes为key,来调用相应的回调函数。父子关系则为/Father/Child这种来标识,attribute则为:/Father/@attri1@attri2。
    这种处理XML的方式对我来说还是挺陌生的,正好自己的“小爬虫”里运用运用。而且假如需要更改XML中某个NodeName的时候,只需要更改Map的相应Key的值,而不用更改处理逻辑,让人感觉很简约。

分享到:
评论
5 楼 mccxj 2011-03-26  
xml的配置解析可以大体分为2部分,一部分是sqlMapConfiguration,一部分是每个sqlMap配置文件。解析的方式都是用类似sax的方式~~主要注册关注的节点事件既可~~修改nodename的时候,可能会涉及xml校验dtd文件的修改~~

mqlfly2008 写道
不知道您是如何看源代码的,有没有什么经验可以谈!ibatis的源码我也看过!是跟随《ibatis源码解析》这本书一起看的!但要达到您这样的水平还需要深入的研究!我主要想问下,楼主在研究源码的时候,是否有些经验可以拿出来分享!比如拿到一份源码,计划如何开始,怎样进行!谢

1.学习怎么用~~根据关注点去找源码
2.testcase is a good start~
3.修改testcase,验证效果是否和自己想的一样~~
4 楼 liubey 2011-03-15  
看到好贴 登陆mark 留着周末研究~
3 楼 jeho0815 2011-03-09  
1024!什么时候我也能达到这种程度啊!
2 楼 C_J 2011-03-06  
不好意思,刚看到回复。

其实那会看源码的目的是提高基础知识,这东西就像房子一样,基本素材是一回事,设计又是另一回事。当你明白了所有的素材有哪些,后面的事情就是弄明白组合关系,思考为什么这样组合,也就是作者的设计思路。
我相信作者也是不断重构而筑成了最后的结果。

我的经验是先横向大致浏览几个模块,不要弄明白细节,但要知道。
然后从某个切入点进行垂直扩展,这样整体和局部结合会有利于对设计的理解。Good Luck!
1 楼 mqlfly2008 2011-01-07  
不知道您是如何看源代码的,有没有什么经验可以谈!ibatis的源码我也看过!是跟随《ibatis源码解析》这本书一起看的!但要达到您这样的水平还需要深入的研究!我主要想问下,楼主在研究源码的时候,是否有些经验可以拿出来分享!比如拿到一份源码,计划如何开始,怎样进行!谢

相关推荐

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好地掌握其实现细节。 首先,iBATIS DAO的核心概念是SQL Maps,它们定义了数据库操作的SQL语句,并将其映射到Java...

    ibatis-2.3.4.726.jar,ibatis-2.3.0.677.jar,ibatis-2.3.3.720.jar下载

    这里提到的是iBATIS的三个不同版本的jar包:ibatis-2.3.4.726.jar、ibatis-2.3.0.677.jar以及ibatis-2.3.3.720.jar。 首先,让我们深入了解iBATIS的核心概念和功能: 1. **SQL Map配置**:iBATIS的核心是SQL Map...

    struts2_spring2.5_ibatis2.3_mysql架构

    *架构struts2_spring2.5_ibatis2.3 *mysql5.0 *jdk 1.6 *带有所有jar包,可直接运行 本实例实现了用户登陆,用户信息CRUD相关操作。让你感受到了ibatis做o/r mapping的方便快捷。 下次集成dwr进来 create ...

    ibatis-2.3.3.720.jar

    ibatis-2.3.3.720.jar

    ibatis2.3.4.8.jar 和 ibatis-2.3.4.726.jar两个版本的下载

    在本主题中,我们将深入探讨Ibatis的两个特定版本:ibatis2.3.4.8.jar和ibatis-2.3.4.726.jar。 Ibatis的核心概念包括映射器(Mapper)、SQL映射文件和SqlSession。映射器是Ibatis的主要组件,它定义了数据库操作与...

    ibatis-2.3.3.7.jar

    ibatis-2.3.3.7.jar

    iBATIS_Spring_struts_demo.rar_DEMO_Struct spring ibatis_ibatis j

    文件“iBATIS_Spring_struts_demo”很可能是这个项目的源码包,包含了相关的配置文件、Java源代码和可能的资源文件。通过分析这个DEMO,开发者可以学习如何配置这些框架,理解它们如何协同工作,以及在实际项目中...

    ibatis-2.3.4.732.jar

    ibatis-2.3.4.732.jar

    ibatis-2.3.4.726最新API chm格式

    ibatis-2.3.4.726最新API chm格式 非常好用

    ibatis-2.3.0.677.jar

    标题 "ibatis-2.3.0.677.jar" 指向的是一个特定版本的 iBATIS 库,即版本号为 2.3.0.677 的 JAR 文件。iBATIS 是一个开源的 Java 框架,主要用于简化数据库与应用程序之间的交互。它在早期广泛应用于企业级应用开发...

    iBATIS_DBL-2.2.0.638.zip_iBATIS_DBL_ibatis_ibatis 2_ibatis2 src_

    这个压缩包提供了对iBatis 2.x版本的深入理解,特别是对于那些希望查看或学习iBatis 2.2.0.638源码的开发者来说,极具价值。 首先,让我们深入了解iBatis的核心概念。iBatis的主要功能是作为一个SQL映射框架,它将...

    ibatis-2.3.2.715

    《深入解析iBatis 2.3.2.715源代码》 iBatis,作为一款轻量级的Java持久层框架,以其灵活、高效的特点,在许多项目中得到了广泛应用。本文将针对iBatis的2.3.2.715版本的源代码进行深入剖析,旨在帮助开发者更好地...

    ibatis2.3-src

    《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。本文将深入剖析iBatis 2.3的源码,帮助读者理解其内部机制,提升开发与优化数据库访问的能力。 1. **...

    10_ibatis教程_ibatis-2.3.3.720.zip

    《深入理解iBatis:基于2.3.3.720版本的教程解析》 iBatis,作为一款优秀的Java持久层框架,为开发者提供了灵活的SQL映射功能,使得数据库操作与业务逻辑分离,提高了开发效率。本教程基于iBatis 2.3.3.720版本,...

    ibatis-2.3.0.677

    ibatis-2.3.0.677 ibatis-2.3.0.677 ibatis-2.3.0.677 ibatis-2.3.0.677 ibatis-2.3.0.677 ibatis-2.3.0.677 ibatis-2.3.0.677

    ibatis-2.3.0.677-sources.jar

    ibatis-2.3.0.677-sources.jar 值得学习的源码资源,不容错过。

    ibatis-2.3.2.715.jar

    《深入解析ibatis-2.3.2.715.jar》 在Java开发领域,Ibatis作为一个轻量级的持久层框架,以其灵活、易用的特点深受开发者喜爱。本次我们将详细探讨`ibatis-2.3.2.715.jar`这个特定版本的Ibatis库,它为开发者提供了...

    ibatis_hibernate3.5_lib.zip

    hibernate下载 : http://sourceforge.net/projects/hibernate/files/hibernate3/--3.XX版本 ...IBATS下载地址:...比如:ibatis-2.3.0.677.jar, spring 可在下载你需要的版本: http://www.springsource.org/download

    ibatis-2.3.4.726-src-源代码

    《深入解析iBatis 2.3.4.726源码》 iBatis,作为一款轻量级的Java持久层框架,以其灵活、高效的特点,在许多项目中得到了广泛应用。本文将针对iBatis 2.3.4.726版本的源代码进行详尽解读,帮助开发者深入了解其内部...

    ibatis_likehbm高效分页组件

    ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件 ibatis_likehbm高效分页组件 ibatis_likehbm...

Global site tag (gtag.js) - Google Analytics