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

相關文章
相關標籤/搜索