Mybatis Mapper 接口工作原理 2 - 获取 mapper 代理对象

sqlSession.getMapper() 获取到的是 Mapper 接口的代理对象。这个代理对象是由 MyBatis 通过 JDK 动态代理 生成的,核心类是 MapperProxy

1 sqlSession.getMapper() 的源码分析

sqlSession.getMapper()SqlSession 接口的方法,其默认实现位于 DefaultSqlSession 中:

@Override
public <T> T getMapper(Class<T> type) {
    return configuration.getMapper(type, this);
}
  • configuration.getMapper():调用 Configuration 对象的 getMapper 方法。

2 Configuration.getMapper() 的源码分析

Configuration 是 MyBatis 的核心配置类,getMapper 方法的实现如下:

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
}
  • mapperRegistry.getMapper():调用 MapperRegistrygetMapper 方法。

3 MapperRegistry.getMapper() 的源码分析

MapperRegistry 是 MyBatis 中用于管理 Mapper 接口的注册中心,getMapper 方法的实现如下:

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
        throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
        return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
        throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
}
  • knownMappers:是一个 Map<Class<?>, MapperProxyFactory<?>>,存储了所有注册的 Mapper 接口和对应的 MapperProxyFactory
  • mapperProxyFactory.newInstance(sqlSession):通过 MapperProxyFactory 创建 Mapper 接口的代理对象。

4 MapperProxyFactory.newInstance() 的源码分析

MapperProxyFactory 是用于创建 Mapper 接口代理对象的工厂类,newInstance 方法的实现如下:

public class MapperProxyFactory<T> {
    private final Class<T> mapperInterface;

    protected T newInstance(MapperProxy<T> mapperProxy) {
        return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
    }

    public T newInstance(SqlSession sqlSession) {
        final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface);
        return newInstance(mapperProxy);
    }
}
  • Proxy.newProxyInstance():使用 JDK 动态代理创建 Mapper 接口的代理对象。
  • MapperProxy:是 InvocationHandler 的实现类,负责拦截 Mapper 接口的方法调用。

总结

sqlSession.getMapper() 获取到的是 Mapper 接口的代理对象,这个代理对象是通过 JDK 动态代理生成的,核心类是 MapperProxy

posted @   CyrusHuang  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示