• java高级架构师教程-mybatis中mapper接口的创建流程


     图灵学院  java高级架构师教程-mybatis中mapper接口的创建流程

        SqlSession的getMapper()

        首先,我们来看下FruitMappermapper=session.getMapper(FruitMapper.class);这段代码,意思很简单,根据传入的class获取这个对象的实例。这个流程有点复杂,阿粉带着大家来跟下源码:

        首先还是ctrl+左键点击getMapper方法,然后会进入到SqlSession的getMapper()方法。然后带着大家了解,SqlSession的默认实现类是DefaultSqlSession,所以我们直接看下getMapper()在DefaultSqlSession里面的实现:

        @Override

        public

        returnconfiguration.getMapper(type,this);

        }

        Configuration的getMapper()

        这里从configuration里面去获取,configuration是全局配置对象,也就是上下文。参数this是当前的SqlSession对象,继续跟进去看下:

        public

        returnmapperRegistry.getMapper(type,sqlSession);

        }

        MapperRegistry的getMapper()

        mapperRegistry对象是干什么的呢?继续点进去:

        public

        finalMapperProxyFactory

        if(mapperProxyFactory==null){

        thrownewBindingException("Type"+type+"isnotknowntotheMapperRegistry.");

        }

        try{

        returnmapperProxyFactory.newInstance(sqlSession);

        }catch(Exceptione){

        thrownewBindingException("Errorgettingmapperinstance.Cause:"+e,e);

        }

        }

        这里就不好看懂了,需要先看下了解下MapperRegistry这个类,我们一步一步来,跟着阿粉的思路走:

        publicclassMapperRegistry{

        privatefinalConfigurationconfig;

        privatefinalMap<Class

        publicMapperRegistry(Configurationconfig){

        this.config=config;

        }

        ...

        }

        了解一个类,首先看下成员变量和构造方法。这里config不用多说了吧,主要的是knownMappers这个成员变量。这就是个map对象,只是这个map对象的value值是个对象,所以又要去看下MapperProxyFactory这个对象,点进去:

        publicclassMapperProxyFactory

        privatefinalClass

        privatefinalMap

        publicMapperProxyFactory(Class

        this.mapperInterface=mapperInterface;

        }

        ...

        }

        首先,单独看一下类名MapperProxyFactory。这个名字很博学。一个好名字会让你知道它在做什么。因此,当您查看MapperProxyFactory时,首先会想到工厂模式。工厂模式有什么作用?谁创建了对象,创建了什么对象?创建MapperProxy对象。MapperProxy也很神秘,什么是Proxy?可以看出,这通常用于使用代理模式创建代理对象。因此,很显然MapperProxyFactory类是一个工厂,它创建了映射器的代理对象。

    java架构师学习路线

        然后这个类里面存的是mapper的接口和接口里面的方法。

        最后,我们回到MapperRegistry类里面的getMapper()方法。现在是不是要清楚一些,通过mapper接口去map里面获取工厂类MapperProxyFactory,然后通过工厂类去创建我们的mapper代理对象。然后在看下getMapper()方法里面的mapperProxyFactory.newInstance(sqlSession);这段代码,继续点进去:

        publicTnewInstance(SqlSessionsqlSession){

        finalMapperProxy

        returnnewInstance(mapperProxy);

        }

        你看,阿粉猜测对不对,MapperProxy对象是不是出来了。然后看newInstance()这个方法:

        protectedTnewInstance(MapperProxy

        return(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy);

        }

        两个newInstance()方法都在MapperProxyFactory这个类里面,这里就很明显嘛。典型的JDK代理对象的创建。

        好了,到这里我们的mapper对象就获取到了。

    如果你想了解更多关于java架构师的专业知识,可以一起交流:11604这里面都是同行05674,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 相关阅读:
    C#中使用OpenSSL的公钥加密/私钥解密
    .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)
    ASP.NET Web API与Owin OAuth:调用与用户相关的Web API
    ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API
    在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token
    C# 中 async/await 调用传统 Begin/End 异步方法
    将GitLab的数据库导入阿里云PostgreSQL RDS
    在Mac/Linux/Windows上编译corefx遇到的问题及解决方法
    在Mac上用自己编译出的DNX运行.NET程序
    [DNX]解决dnu restore时找不到Newtonsoft.Json的问题
  • 原文地址:https://www.cnblogs.com/tulingxueyuan/p/14087576.html
Copyright © 2020-2023  润新知