有时候咱们须要自行定义一些注解来标记某些特定功能的类并将它们注入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 获取更多资讯