在 MyBatis 应用中,我们定义的 Mapper 接口,最终都会转换为 JDK 动态代理对象 Proxy。
假设有 UserMapper.xml:
1 | SqlSession sqlSession = sqlSessionFactory.openSession(); |
在 MyBatis 的框架中,提供了 SqlSession 的默认实现类 DefaultSqlSession,关注其实现方法 getMapper():
1 | // DefaultSqlSession.java |
方法 getMapper 内部调用了属性 Configuration 的 getMapper 方法,将代码细节委托给 Configuration 实现。
1 | // Configuration.java |
Configuration 内部的实现是将 getMapper 的细节委托给 MapperRegistry 实现,顾名思义,Mapper 注册表。
1 | // MapperRegistry.java |
由 MapperRegistry 的实现可以知道,其内部维护了一个 knownMappers 结构,用于进行 Mapper 接口到 MapperProxyFactory 的映射:
1 | private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>(); |
MapperProxyFactory,由类名可以知道这是一个批量生产 MapperProxy 的工厂类,关注其如何生产 MapperProxy
1 | // MapperProxyFactory.java |
首先,创建了一个 MapperProxy,这是一个由 MyBatis 提供的 InvocationHandler 的实现类,然后将其传递给 Proxy.newProxyInstance 方法创建 Proxy 并返回。
从名字上看,MapperProxyFactory 似乎是生产 MapperProxy 的工厂,但在过程中,MapperProxy 只是扮演了代理类的 Handler 角色,MapperProxyFactory 真正生产的应该是代理类。
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章