首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-09-10 
ibatis_2.3源码水平浅析(待续)题记:??? 总得开个头吧。前一篇垂直分析。?客户端初始化 ?Reader readernull

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的值,而不用更改处理逻辑,让人感觉很简约。

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

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

我的经验是先横向大致浏览几个模块,不要弄明白细节,但要知道。
然后从某个切入点进行垂直扩展,这样整体和局部结合会有利于对设计的理解。Good Luck! 3 楼 jeho0815 2011-03-09   1024!什么时候我也能达到这种程度啊! 4 楼 liubey 2011-03-15   看到好贴 登陆mark 留着周末研究~ 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,验证效果是否和自己想的一样~~

热点排行