这两个接口都可以用于动态注册bean对应BeanDefinition到容器中。
BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor
实现了BeanFactoryPostProcessor
接口,是Spring框架的 BeanDefinitionRegistry
的后处理器,
用来注册额外的 BeanDefinition。
postProcessBeanDefinitionRegistry
方法会在所有的BeanDefinition已经被加载了,但是所有的Bean还没有被创建前调用。
BeanDefinitionRegistryPostProcessor 经常被用来注册BeanFactoryPostProcessor的BeanDefinition。
Mybatis和spring整合时,我们通常会在application.xml中配置一个Bean,也就是MapperScannerConfigurer(该类实现了BeanDefinitionRegistryPostProcessor接口,所以支持动态注册mapper为Bean组件,并注入到spring容器中)。指定该Bean的包扫描路径属性。
ImportBeanDefinitionRegistrar
@Import注解用来支持在Configuration类中引入其他的配置类,包括Configuration类,ImportSelector和ImportBeanDefinitionRegistrar的实现类。
调用时机
ImportBeanDefinitionRegistrar在ConfigurationClassPostProcessor
处理Configuration类期间被调用,用来生成该Configuration类所需要的BeanDefinition。
而ConfigurationClassPostProcessor正实现了BeanDefinitionRegistryPostProcessor接口(所以支持mapper注册成bean,并注入到spring容器中)。
Mybatis和springboot整合时,我们通常是在main方法启动类中,添加@MapperScan(basePackage = “”)来指定包的扫描,
MapperScannerRegistrar
具体可以参考Mybatis 的 MapperScannerRegistrar 源码的实现。
该类就实现了ImportBeanDefinitionRegistrar接口。
具体到该接口方法执行时,会去查找该注解指定的包扫描范围。
如下图,通过annoAttrs可以保存注解@MapperScan的属性和值的键值对。
这里的关键点,是注解引入了@Import,这样该类中才会生效,并执行。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
@Repeatable(MapperScans.class)
public @interface MapperScan {
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69692.html