初始化
为每一个业务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启用一级缓存