Mybatis源码解析(二)

开课吧开课吧锤锤2021-03-03 10:32

    Java是一门全球范围内使用最广泛的,面向对象的编程语言。Java语言具有功能强大和简单易用两个特征,它作为面向对象编程语言系列的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java

    二、SqlSessionFactory的创建

    2.1整体介绍

    SqlSessionFactory的创建是SqlSessionFactoryBuilder通过mybatis主配置文件构建出的:

    publicSqlSessionFactorybuild(InputStreaminputStream,Stringenvironment,Propertiesproperties){

    SqlSessionFactoryvar5;

    try{

    XMLConfigBuilderparser=newXMLConfigBuilder(inputStream,environment,properties);

    /**主要逻辑在下面这行代码*/

    var5=this.build(parser.parse());

    }

    ……

    ……

    returnvar5;

    }

    parser.parse()到底做了什么呢?看如下代码:

    privatevoidparseConfiguration(XNoderoot){

    try{

    /**解析配置文件中的各种属性*/

    this.propertiesElement(root.evalNode("properties"));

    /**解析别名配置*/

    this.typeAliasesElement(root.evalNode("typeAliases"));

    /**解析插件配置*/

    this.pluginElement(root.evalNode("plugins"));

    /**解析对象工厂元素*/

    this.objectFactoryElement(root.evalNode("objectFactory"));

    this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));

    /**解析mybatis的全局设置信息*/

    this.settingsElement(root.evalNode("settings"));

    /**解析mybatis的环境配置*/

    this.environmentsElement(root.evalNode("environments"));

    this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));

    /**解析类型处理器配置信息*/

    this.typeHandlerElement(root.evalNode("typeHandlers"));

    /**解析mapper配置信息*/

    this.mapperElement(root.evalNode("mappers"));

    }catch(Exceptionvar3){

    thrownewBuilderException("ErrorparsingSQLMapperConfiguration.Cause:"+var3,var3);

    }

    }

    实际上就是解析主配置文件中的各个节点,然后保存在Configuration当中,然后使用Configuration创建出一个DefaultSqlsessionFactory对象,至此过程结束:

    publicSqlSessionFactorybuild(Configurationconfig){

    returnnewDefaultSqlSessionFactory(config);

    }

    此处,我们可以重点关注如下两个地方,看看具体在做了什么动作:

    this.pluginElement(root.evalNode("plugins"));this.mapperElement(root.evalNode("mappers"));

    以上两个点分别是插件注册,和mapper的扫描注册。

    2.2插件的注册

    首先我们先看一下源代码:

    privatevoidpluginElement(XNodeparent)throwsException{

    if(parent!=null){

    Iteratori$=parent.getChildren().iterator();

    while(i$.hasNext()){

    XNodechild=(XNode)i$.next();

    Stringinterceptor=child.getStringAttribute("interceptor");

    Propertiesproperties=child.getChildrenAsProperties();

    /**实例化拦截器类*/

    InterceptorinterceptorInstance=(Interceptor)this.resolveClass(interceptor).newInstance();

    interceptorInstance.setProperties(properties);

    /**将实例化的拦截器类放到configuration中的interceptorChain中*/

    this.configuration.addInterceptor(interceptorInstance);

    }

    }

    }

    实际上就是通过interceptor标签,解析出拦截器类,然后将其实例化并保存到Configuration类中的InterceptorChain中,以备后用。

    publicvoidaddInterceptor(Interceptorinterceptor){

    this.interceptorChain.addInterceptor(interceptor);

    }

    以上内容由开课吧老师左撇子小哥哥提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享