Spring整合Mybatis源码解析:@MapperScan原理(一)

一、Spring启动流程分析:

1.spring容器启动时会调用所有BeanFactoryPostProfessor的postProcessBeanFactory()方法,首先调用所有BeanDefinitionRegistryPostProcessor类型的(AnnotationConfigApplicationContext启动时会向容器中添加ConfigurationClassPostprocessor,该类实现了BeanDefinitionRegistryPostProcessor):

在这里插入图片描述

看下ConfigurationClassPostProfessor 执行过程:

1)通过 parser.parse(candidates)解析配置类上的所有注解

在这里插入图片描述

2)当解析到@Import注解时,会对Import中的类做判断,有三种情况:

  • 普通类
  • ImportSeletor
  • ImportBeanDefinitionRefistrar
    在这里插入图片描述

对ImportBeanDefinitionRefistrar的处理如下:

在这里插入图片描述
将其放到了ConfigurationClass的importBeanDefinitionRegistrars中:
在这里插入图片描述
而该ConfigurationClass会被添加到parser的configurationClasses中:
在这里插入图片描述
3)解析完所有注解后,会遍历所有ConfigrationClasses的importBeanDefinitionRegistrars,执行registerBeanDefinitions()方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.调用完所有BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProfessor之后,调用实现了BeanDefintionRegistryPostProcessor & PriortiyOrdered接口的实现类;

在这里插入图片描述

3.调用实现了BeanDefintionRegistryPostProcessor & Ordered接口的实现类 ;

在这里插入图片描述

4.最后会再调用一遍所有的BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProfessor(执行完ConfigurationClassPostProcessor后新注入进容器中的):

在这里插入图片描述

二、@MapperScan处理

1.@MapperScan注解:

在这里插入图片描述
当ConfigurationClassPostProcess解析到加了@MapperScan注解的配置类之后,获取到MapperScannerRegistrar,而MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar,因此会调用其registerBeanDefinitions()方法:
在这里插入图片描述
该方法会向容器中添加MapperScannerConfigurer,该类信息如下:
在这里插入图片描述

2.MapperScannerConfigurer:

该类实现了BeanDefinitionRegistryPostProcess接口,因此在invokeBeanFactoryPostProcessors()的最后一步会调用MapperScannerConfigurer的postProcessBeanDefinitionRegistry(),方法信息如下:
在这里插入图片描述
scanner的 scan()方法就会扫描我们在@MapperScan中配置的路径下的所有mapper接口,scan()方法详解放到下一篇来说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值