Mybatis源码解析(五)

开课吧开课吧锤锤2021-03-03 11:01

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

Java

    四、Mapper代理的生成

    当我们使用如下代码:

    UserMappermapper=session.getMapper(UserMapper.class);

    来获取UserMapper的时候,实际上是从configuration当中的MapperRegistry当中获取UserMapper的代理对象:

    public<T>TgetMapper(Class<T>type,SqlSessionsqlSession){

    finalMapperProxyFactory<T>mapperProxyFactory=(MapperProxyFactory<T>)knownMappers.get(type);

    if(mapperProxyFactory==null)

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

    try{

    returnmapperProxyFactory.newInstance(sqlSession);

    }catch(Exceptione){

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

    }

    }

    knownMappers属性里面的值,实际上就是我们在mappers扫描与解析的时候放进去的。

    protectedTnewInstance(MapperProxy<T>mapperProxy){

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

    }

    publicTnewInstance(SqlSessionsqlSession){

    finalMapperProxy<T>mapperProxy=newMapperProxy<T>(sqlSession,mapperInterface,methodCache);

    returnnewInstance(mapperProxy);

    }

    并且MapperProxy实现了InvocationHandler接口,从以上代码可以看出,实际上使用的就是jdk的动态代理,给UserMapper接口生成一个代理对象。实际上就是MapperProxy的一个对象,如下图调试信息所示:

Java

    所以整个代理对象生成过程可以用如下时序图表示:

Java

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

有用
分享