一 SqlSession创建接口代理对象流程
二 创建过程源码解析
(1)首先通过sqlsession调用getMapper(class)
(2)进入DefaultSqlsesion中,调用Configuration.getMapper(class,sqlsession)
(3) 进入到Configuration中
(4)进入到MapperRegistry根据class获取对应MapperProxyFactory工厂,每一个xml映射文件都对应一个MapperProxyFactory工厂,拿到工厂调用newsInstance创建代理对象
三 仿照源码手写代理对象创建过程分析
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"); } }
结果: