mybatis初始调用流程

初始化

为每一个业务mapper创建代理对象

1.@MapperScan

2.MapperScannerRegistrar#registerBeanDefinitions

MapperScannerRegistrar 实现了ImportBeanDefinitionRegistrar接口,ImportBeanDefinitionRegistrar处理时机如下图。

  • ConfigurationClassPostProcessor->postProcessBeanDefinitionRegistry->processConfigBeanDefinitions->
    ->this.reader.loadBeanDefinitions(configClasses)->
    loadBeanDefinitionsForConfigurationClass->loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());//处理ImportBeanDefinitionRegistrar,调用registerBeanDefinitions()方法
    
  • ConfigurationClassPostProcessor 是一个非常重要的后置处理器,主要用于@Configuration定义的配置类

    • ConfigurationClassPostProcessor注册时机
    • springApplication->run->createApplicationContext()–>AnnotationConfigApplicationContext()->
      new AnnotatedBeanDefinitionReader(this)->AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
      ->
    • 在这里插入图片描述
  • 主调用入口为AbstractApplicationContext#invokeBeanFactoryPostProcessors ,这是容器刷新12大步里面最核心的一步

在这里插入图片描述

3.ClassPathMapperScanner#processBeanDefinitions

definition.getConstructorArgumentValues().addGenericArgumentValue(beanClassName); // issue #59
//  private Class<? extends MapperFactoryBean> mapperFactoryBeanClass = MapperFactoryBean.class;
definition.setBeanClass(this.mapperFactoryBeanClass);

4.MapperFactoryBean类初始getObject()

5.SqlSessionTemplate#getMapper(Class type)

6.MybatisConfiguration#getMapper(Class type, SqlSession sqlSession)

7.MybatisMapperRegistry#getMapper(Class type, SqlSession sqlSession)

生成mapper对象的代理类MybatisMapperProxyFactory

执行业务操作

1.MybatisMapperProxyFactory#invoke

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            if (Object.class.equals(method.getDeclaringClass())) {
                return method.invoke(this, args);
            } else if (isDefaultMethod(method)) {
                return invokeDefaultMethod(proxy, method, args);
            }
        } catch (Throwable t) {
            throw ExceptionUtil.unwrapThrowable(t);
        }
        final MybatisMapperMethod mapperMethod = cachedMapperMethod(method);
        return mapperMethod.execute(sqlSession, args);
    }

2.MybatisMapperMethod#execute

3.DefaultSqlSession#selectList等方法

4.BaseExecutor#query

CachingExecutor启用一级缓存

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值