Mybatis是怎么将@Mapper的给扫描到Spring容器中的

2023-11-09

  • 废话不多说直接进入正题:

@MapperScan

  • 在使用注解确认扫包范围的时候
  • 注解里的@Import(MapperScannerRegistrar.class)
  • 引入了 MapperScannerRegistrar 这个类,然后引入了MapperScannerConfigurer 这个类。进行的扫描
  • 因为该类实现了 ImportBeanDefinitionRegistrar
  • 在SpringBoot启动的时候 按照链路执行到方法 AbstractApplicationContext -> refresh ->invokeBeanFactoryPostProcessors -> PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors -> ConfigurationClassPostProcessor#processConfigBeanDefinitions->ImportBeanDefinitionRegistrar#registerBeanDefinitions
/**
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法
**/
	/**
	 * 先执行 BeanDefinitionRegistryPostProcessor 的方法,然后执行 BeanFactoryPostProcessor 的方法
	 * @param beanFactory
	 * @param beanFactoryPostProcessors
	 */
	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		// 定义一个 set 保存所有的 BeanFactoryPostProcessors
		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		Set<String> processedBeans = new HashSet<>();
		// 如果当前 BeanFactory 为 BeanDefinitionRegistry
		if (beanFactory instanceof BeanDefinitionRegistry) {
			//....省略大部分
			// 最终调用了 this.reader.loadBeanDefinitions 加载所有的 beanBeanDefinition 到工厂中
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			// 清空,以备下次使用
			currentRegistryProcessors.clear();

			//....省略大部分
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
		
			while (reiterate) {
				reiterate = false;
				//....省略大部分
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}
  		}
	}
  • 上方主要逻辑概括为。这个位置 其实是spring扫包环节。主要的就是把spring扫描范围的bean给扫到 beanDefinitionMap 中去第一次主要是在ConfigurationClassPostProcessor所以定义的都找到。第二次 调用实现PriorityOrderedBeanDefinitionRegistryPostProcessor 最后,调用所有其他实现了BeanDefinitionRegistryPostProcessor的bean,直到不再出现其他BeanDefinitionRegistryPostProcessor
  • 上附代码
    • 第一个invokeBeanDefinitionRegistryPostProcessors 会触发 ConfigurationClassPostProcessor#processConfigBeanDefinitions 这个类然后调用this.reader.loadBeanDefinitions(configClasses);触发实现 ImportBeanDefinitionRegistrar 接口的 registerBeanDefinitions方法。这样就完成了 MapperScannerConfigurer的注入
    • 第三 invokeBeanDefinitionRegistryPostProcessors 会循环到 MapperScannerConfigurer 然后触发 postProcessBeanDefinitionRegistry 这个方法的循环扫到。执行 MapperScannerConfigurer#postProcessBeanDefinitionRegistry 方法进行扫描@Mapper
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis是怎么将@Mapper的给扫描到Spring容器中的 的相关文章

  • 与 Spring 3.2.1.RELEASE 和 spring security 3.1.3.RELEASE 冲突。 java.lang.NoSuchFieldError: NULL

    我收到如下错误春季 3 2 1 发布和春天安全 3 1 3 发布 org springframework beans factory BeanCreationException Error creating bean with name y
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • Java中Gson、JsonElement、String比较

    好吧 我想知道这可能非常简单和愚蠢 但在与这种情况作斗争一段时间后 我不知道发生了什么 我正在使用 Gson 来处理一些 JSON 元素 在我的代码中的某个位置 我将 JsonObject 的 JsonElements 之一作为字符串获取
  • 如何使用 Java Apache POI 隐藏 Excel 工作表中以下未使用的行?

    我正在使用数据库中的数据填充模板 Excel 工作表 for Map
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • GWT、Maven、Spring - 在 Maven 构建上获取 com.thoughtworks.qdox.parser.ParseException:语法错误

    我正在尝试集成此演示中的代码 http code google com p gwt spring starter app http code google com p gwt spring starter app 进入我的主要 Spring
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐