Mybatis是如何将Mapper接口注册到Spring IoC的

1. 前言

有时候咱们须要自行定义一些注解来标记某些特定功能的类并将它们注入Spring IoC容器。比较有表明性的就是MybatisMapper接口。假若有一个新的需求让你也实现相似的功能你该如何下手呢?今天咱们就从Mybatis的相关功能入手来学习其思路并为我所用。html

2. Mybatis Mapper注册机制

Mybatis结合SpringMapper注册到Spring IoC的机制是这样的:java

Mybatis Mapper注入到Spring IoC的流程

其实里面涉及到SpringMybatis的知识点仍是比较多的,可是咱们只要梳理出来流程就比较容易理解和掌握。因此阅读源码的精髓在于先掌握一片叶子的脉络,而后各个击破去梳理其走向。因此胖哥梳理出左边的就是右边的“脉络”,接下来咱们就一步步剖析它们。spring

3. ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar是一个很是重要的接口,凡是要把第三方整合到Spring的开发者都应该掌握这个接口。这接口用来动态的注册某一些具备相同特征的一批类到Spring IoC,用法有点相似 ImportSelector接口,借助于@Import注解“附着在”自定义的注解上,就像Mybatis-Spring的用法同样。mybatis

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
@Repeatable(MapperScans.class)
public @interface MapperScan {
    // 省略
}

也能够直接附着到标记有@Configuration或者具备相同功能的配置类上。app

@Import(MapperScannerRegistrar.class)
@Configuration
public class MyConfig {
}

它只有一个方法:post

void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

其中参数importingClassMetadata包含了@Import所依附的配置类上的全部注解。这意味着咱们能够拿到对应注解的元信息并做为咱们动态导入的判断依据,上面就是从@MapperScan获取了Mapper所在的包以及其它信息。而BeanDefinitionRegistry就是用来注册Spring Bean的。那么究竟是如何注册的呢?咱们接着往下看。学习

4. BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor的子接口,BeanFactoryPostProcessor的做用是在Spring Bean的定义信息已经加载但尚未初始化的时候执行postProcessBeanFactory()来处理一些额外的逻辑,而BeanDefinitionRegistryPostProcessor的做用是在BeanFactoryPostProcessor增长了一个前置处理,当一个Bean实现了该接口后,始化前先执行该接口的postProcessBeanDefinitionRegistry()方法,而后再执行其父类的方法postProcessBeanFactory()。这样就把一个Spring Bean的初始化周期更加细化,让咱们在各个阶段有定制它的可能。spa

可是对于本文来讲这个类实际上是能够忽略的,该类只是触发了批量扫描注入逻辑,它并无实际参与扫描注入。3d

5. ClassPathBeanDefinitionScanner

从名字上来看这个类就是在类路径下扫描Bean定义并将符合条件的批量经过BeanDefinitionRegistry注册到Spring IoC。它提供了一些默认的过滤器来检出须要被注入Spring IoCBean,默认使用JSR 250JSR 330的两个注解。固然你能够经过addIncludeFilter来新增被包含的Bean,或者addExcludeFilter来排除一些Bean。而后只须要调用其scan方法对特定的包进行扫描注入。code

6. FactoryBean

就像MybatisMapper同样,它们具备共同的特色的同时也有一些差别。因此使用FactoryBean接口来建立这些Mapper再合适不过了。关于FactoryBean我在 Spring 中的FactoryBean 与BeanFactory 一文中专门来说解它,有兴趣的能够去了解。

可是FactoryBean 并非动态扫描注入的必选步骤。

7. 总结

本文经过对**Mybatis **的注入机制进行了分析来研究ImportBeanDefinitionRegistrar的生命周期和使用。如何经过它来编写咱们本身的注入逻辑才是最重要的,后续我会讲一些这方面的实际应用,请持续关注: 码农小胖哥

关注公众号:Felordcn 获取更多资讯

我的博客:https://felord.cn

相关文章
相关标签/搜索