有時候咱們須要自行定義一些註解來標記某些特定功能的類並將它們注入Spring IoC容器。比較有表明性的就是Mybatis的Mapper接口。假若有一個新的需求讓你也實現相似的功能你該如何下手呢?今天咱們就從Mybatis的相關功能入手來學習其思路併爲我所用。html
Mybatis結合Spring將Mapper註冊到Spring IoC的機制是這樣的:java
其實裏面涉及到Spring和Mybatis的知識點仍是比較多的,可是咱們只要梳理出來流程就比較容易理解和掌握。因此閱讀源碼的精髓在於先掌握一片葉子的脈絡,而後各個擊破去梳理其走向。因此胖哥梳理出左邊的就是右邊的「脈絡」,接下來咱們就一步步剖析它們。spring
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的。那麼究竟是如何註冊的呢?咱們接着往下看。學習
BeanDefinitionRegistryPostProcessor
是BeanFactoryPostProcessor
的子接口,BeanFactoryPostProcessor
的做用是在Spring Bean的定義信息已經加載但尚未初始化的時候執行postProcessBeanFactory()
來處理一些額外的邏輯,而BeanDefinitionRegistryPostProcessor
的做用是在BeanFactoryPostProcessor
增長了一個前置處理,當一個Bean實現了該接口後,始化前先執行該接口的postProcessBeanDefinitionRegistry()
方法,而後再執行其父類的方法postProcessBeanFactory()
。這樣就把一個Spring Bean的初始化週期更加細化,讓咱們在各個階段有定製它的可能。spa
可是對於本文來講這個類實際上是能夠忽略的,該類只是觸發了批量掃描注入邏輯,它並無實際參與掃描注入。3d
從名字上來看這個類就是在類路徑下掃描Bean定義並將符合條件的批量經過BeanDefinitionRegistry
註冊到Spring IoC。它提供了一些默認的過濾器來檢出須要被注入Spring IoC的Bean,默認使用JSR 250和JSR 330的兩個註解。固然你能夠經過addIncludeFilter
來新增被包含的Bean,或者addExcludeFilter
來排除一些Bean。而後只須要調用其scan
方法對特定的包進行掃描注入。code
就像Mybatis的Mapper同樣,它們具備共同的特色的同時也有一些差別。因此使用FactoryBean
接口來建立這些Mapper再合適不過了。關於FactoryBean
我在 Spring 中的FactoryBean 與BeanFactory 一文中專門來說解它,有興趣的能夠去了解。
可是
FactoryBean
並非動態掃描注入的必選步驟。
本文經過對**Mybatis **的注入機制進行了分析來研究ImportBeanDefinitionRegistrar
的生命週期和使用。如何經過它來編寫咱們本身的注入邏輯纔是最重要的,後續我會講一些這方面的實際應用,請持續關注: 碼農小胖哥。
關注公衆號:Felordcn 獲取更多資訊