SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

一  SqlSession创建接口代理对象流程

  SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

二  创建过程源码解析

   (1)首先通过sqlsession调用getMapper(class)

     SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

  (2)进入DefaultSqlsesion中,调用Configuration.getMapper(class,sqlsession)

    SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

   (3) 进入到Configuration中

    SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

  (4)进入到MapperRegistry根据class获取对应MapperProxyFactory工厂,每一个xml映射文件都对应一个MapperProxyFactory工厂,拿到工厂调用newsInstance创建代理对象

    SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

 

三   仿照源码手写代理对象创建过程分析

  

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

//普通dao接口
interface SearchDao{
    List<Object>  selectList(String msg);
}
//对应mybatis中的SqlSession
interface SqlSession{
    
    Object  selectOne(String statement);
}
//对应mybatis中的DefaultSqlSession
class DefaultSqlSession implements SqlSession{

    public Object selectOne(String statement) {
        System.out.println(statement);
        return null;
    }    
}
/*
 * 代理对象创建工厂
 */
class MapperProxyFactory{
    Class<?>  targetInterface;
    
    public MapperProxyFactory(Class<?> targetInterface ) {
        this.targetInterface = targetInterface;
    }
    
    Object newInstance(MapperProxyHandler mapperProxyHandler) {
        return  Proxy.newProxyInstance(targetInterface.getClassLoader(), new Class[] {targetInterface},mapperProxyHandler); 
    }
}

/*
 * 代理对象处理器对应mybatis中的MapperProxy,处理业务的
 */
class MapperProxyHandler implements InvocationHandler{

    private SqlSession sqlSession;
    private Class<?>  targetInterface;
    
    public MapperProxyHandler(SqlSession sqlSession, Class<?> targetInterface) {
        super();
        this.sqlSession = sqlSession;
        this.targetInterface = targetInterface;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String statement=targetInterface.getName()+"."+method.getName();
        sqlSession.selectOne(statement);
        return null;
    }
}

public class MapperProxyTest {
    public static void main(String[] args) {        
        SqlSession sqlSession=new DefaultSqlSession();
        MapperProxyHandler proxyHandler=new MapperProxyHandler(sqlSession,SearchDao.class);
    
        MapperProxyFactory factory= new MapperProxyFactory(SearchDao.class);        
        SearchDao dao=(SearchDao) factory.newInstance(proxyHandler);    
        System.out.println("代理对象: "+dao.getClass().getName());
        dao.selectList("test");
    }
}

 

      结果:

    SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写    

SqlSession通过getMapper创建代理对象过程分析以及底层源码部分编写

上一篇:iOS ViewController跳转界面的几种方法简单总结


下一篇:SSH客户端工具连接Linux(有的也可以连接Windows、mac、、iOS等多系统平台)