《底层到底做了什么》--- mybatis-plus的一次select调用过程

使用mybatis-plus创建db mapper,只需要写一个接口继承BaseMapper,比如示例中的EntityMapper。

@Mapper
@Repository
public interface EntityMapper extends BaseMapper {}
 

本文将解释在底层一次select调用是怎么完成。 主要包括以下几个部分:

  1. 核心类及包
  2. 容器初始化
  3. Mapper bean初始化
  4. 代理方法调用

核心类及所在包

主要涉及以下包和类。

mybatis-plus-annotation
MybatisSqlSessionFactoryBean
ServiceImpl
mybatis-spring
MapperFactoryBean
mybatis-plus-core
MybatisConfiguration
MybatisMapperRegistry
MybatisMapperProxyFactory
MybatisMapperProxy
MybatisMapperMethod

容器初始化

spring 递归初始化以下类,包括:

MybatisPlusAutoConfiguration
MybatisSqlSessionFactoryBean
MybatisConfiguration
MybatisMapperRegistry

这里不一一说明各类的初始化过程,只拿出MybatisMapperRegistry。该类用来实际存储mapper的实现

public class MybatisMapperRegistry extends MapperRegistry {
    private final Configuration config;
    private final Map, MybatisMapperProxyFactory> knownMappers = new HashMap();
}

mapper bean的初始化

1、spring调用 MapperFactoryBean 初始化声明的mapper接口的bean。


public class MapperFactoryBean extends SqlSessionDaoSupport implements FactoryBean {
    public T getObject() throws Exception {
        return this.getSqlSession().getMapper(this.mapperInterface);
    }
}

该方法会递归调用上文已经初始化的 MybatisConfigurationMybatisMapperRegistry,最终使用 MybatisMapperProxyFactory 生成代理类。

  1. 生成代理类,并放入 MybatisMapperRegistry 容器中

public class MybatisMapperProxyFactory {

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

select调用

  1. 获取注入的代理类bean
  2. 调用select方法
  3. 实际调用代理方法

     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{}
    
    //省略
     return new MybatisMapperProxy.PlainMethodInvoker(new MybatisMapperMethod(this.mapperInterface, method, this.sqlSession.getConfiguration()));

    这里的MybatisMapperMethod,包含实际的select方法

到此流程基本执行完成。

你可能感兴趣的:(《底层到底做了什么》--- mybatis-plus的一次select调用过程)