SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
User userMapper = sqlSession.getMapper(User.class);
首先,sqlSession调用getMapper(Class<?> type)方法,参数里传入指定的Class类型,返回给我们的就是一个传入该类型的对象,这个对象其实是一个代理对象,
进入到getMapper(type)方法后,再次调用 configuration.getMapper(type,sqllSession),
在Configuration类中,继续调用mapperRegistry.getMapper(type,sqlSession)方法。
mapperRegistry, 在获取SqlSessionFactory时,解析mapper子节点时,将获取的Mapper接口都放在一个knowMappers(其实是一个hashMap)中。
在mapperRegistry.getMapper(type,sqlSession)方法中,先从knowMappers取出该type对应的mapperProxyFactory,
顾名思义,这是一个mapper代理工厂,我们需要的对象应该就是从工厂中生成的。
接着调用mapperProxyFactory.newInstance(sqlSession)方法,果不其然,先new出一个MapperProxy对象,
这个对象看了一下,实现了InvocationHandler接口,jdk的动态代理,而jdk的动态代理就要求被代理的类必须要实现接口,
所以mybatis基于接口的实现方式,就是用了jdk的动态代理,这个对象里还有其他一些信息,比如methodCache(方法缓存)。
继续调用newInstance(mapperProxy)方法,
接下来看着,
也就是jdk动态代理的获取代理对象的方法:
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
下面就是jdk动态代理方面的东西了,接下来就是验证、优化、缓存、同步、生成字节码、显式类加载等操作。
mybatis就是通过这个代理对象去执行对应的增删改查方法
