前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅聊Mybatis是怎么扫描并且注入到spring容器中的(源码向)

浅聊Mybatis是怎么扫描并且注入到spring容器中的(源码向)

作者头像
云扬四海
发布2022-06-23 14:37:47
4240
发布2022-06-23 14:37:47
举报
文章被收录于专栏:云扬四海
  • 源码很枯燥,但是能学到很多东西,废话不多说直接进入正题:
@MapperScan 扫描注入 spring beanDefinition 的流程
  • 在使用注解确认扫包范围的时候
  • 注解里的@Import(MapperScannerRegistrar.class)
  • 引入了 MapperScannerRegistrar 这个类,然后引入了MapperScannerConfigurer 这个类。进行的扫描
  • 因为该类实现了 ImportBeanDefinitionRegistrar
  • 在SpringBoot启动的时候 以下是完整的 spring 到 mybatis scan 的完整流程. 有兴趣的朋友可以ctrl + N 跟着看看数据
    • 1.初始化环境: AbstractApplicationContext#refresh ->
    • 2.激活各种BeanFactory处理器: invokeBeanFactoryPostProcessors ->
    • 3.循环扫描bean定义:PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors ->
    • 4.调用bean定义注册处理器:PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors ->
    • 5.bean定义注册处理器:(许多框架都是实现此处进行指定bean的定义注入)BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry ->
    • 6.spring第一次会加载 (完成一些主要的扫描): ConfigurationClassPostProcessor ->
    • 7.加载扫描到的bean定义: this.reader.loadBeanDefinitions(configClasses) ->
    • 8.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsFromRegistrars ->
    • 9.ImportBeanDefinitionRegistrar#registerBeanDefinitions ->
    • 10.注册bean定义:(将 MapperScannerConfigurer 加载入bean容器中) MapperScannerRegistrar#registerBeanDefinitions ->
    • 11.然后callBack到3->4->5: MapperScannerConfigurer#postProcessBeanDefinitionRegistry ->
    • 11.进行mybatis的扫描: ClassPathMapperScanner#doScan ->
    • 12.将所有符合扫描条件的类都注册到bean中,设置 MapperFactoryBean 作为 FactoryBean: ClassPathMapperScanner#processBeanDefinitions

简要说一下 Mapper 的加载流程

  • 上述流程中。就是 @MapperScan 注解。使得符合条件的类都 以 FactoryBean 的定义注入到了 beanDefinition 中
  • 那么 doGetBean 的流程是这样:
    1. bean启动流程中 会先加载实现了 InitializingBean的方法 : MapperFactoryBean extends SqlSessionDaoSupport extends DaoSupport implements InitializingBean ->
    2. 由于继承关系,会初始化方法: MapperFactoryBean#checkDaoConfig ->
    3. 调用: Configuration#addMapper ->
    4. 调用: MapperRegistry#addMapper ->
    5. 分析xml数据: MapperAnnotationBuilder#parse ->
    6. 解析并添加MappedStatement (提供给调用mapper方法的时候使用): MapperAnnotationBuilder#addMappedStatement ->
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @MapperScan 扫描注入 spring beanDefinition 的流程
  • 简要说一下 Mapper 的加载流程
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档