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就是通过这个代理对象去执行对应的增删改查方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69686.html