Spring框架中ImportBeanDefinitionRegistrar的应用

本文深入探讨Spring框架中ImportBeanDefinitionRegistrar接口的功能与用法,通过实例展示如何利用该接口手动注册BeanDefinition到Spring容器中,同时揭示其在Mybatis等实际应用场景中的作用。

前言

上一篇博客【Spring框架的ImportSelector到底可以干嘛】我们讲过如果一个类实现了ImportSelector接口,并且在配置类中被@Import加入到Spring容器中以后。Spring容器就会把ImportSelector接口方法返回的字符串数组中的类new出来对象然后放到工厂中去。并且做了一个功能开关的例子辅助讲解其功能。这次我们就接着上次讲解ImportSelector接口的内容继续扩展讲解ImportBeanDefinitionRegistrar的用法。更多Spring内容进入【Spring解读系列目录】

ImportBeanDefinitionRegistrar

按照惯例我们还是先介绍一下这个接口里面最重要的方法:registerBeanDefinitions

public interface ImportBeanDefinitionRegistrar {
   
   
	//虽然是俩方法,但是等于一个方法
	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
         BeanNameGenerator importBeanNameGenerator) {
   
   
	//直接调用了下面的方法
      registerBeanDefinitions(importingClassMetadata, registry);
   }
   default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
   
   
   }
}

里面一共两个方法而且都被default注解了,可见确实用的不多。但是这个方法却拥有ImportSelector接口内方法的一切功能,而且更强大。这俩方法是重载方法,区别就在于有没有BeanNameGenerator,这个接口是Spring内置的BeanName生成器,无关大雅。但是注意到第一个方法其实是调用了第二个方法去实现的,可以说方法一是一个扩展,也可以说方法一等于方法二。那就直接解析参数。

  1. 第一个参数AnnotationMetadata importingClassMetadata:这个参数和ImportSelector中的一样,可以拿到被@Import注解过的类的元数据,具体到例子就是笔者一直写的配置类AppConfig.class。因为也不打算进行修改,所以这个不多说。
  2. 第二个参数BeanDefinitionRegistry registry:这个参数厉害了。BeanDefinitionRegistry这个接口我们以前说过,Spring想要把一个类变成对象就一定会把这个类变成一个BeanDefinition对象。这个过程怎么来的呢?就是通过实现BeanDefinitionRegistry接口类的构造方法做的。

Spring把在方法中把这个接口开放出来,就意味着我们可以在这里手动添加一个BeanDefinition给Spring容器,然后构建对象出来。通过registry我们就可以注册一个BeanDefinition进入Spring容器,就使用下面的这个方法:

registry.registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

ImportBeanDefinitionRegistrar例子

按照常规我们先把必要的类都先创建出来。一个业务接口ImportTestDao,一个业务类依赖该接口ImportTestService,一个配置类AppConfig,一个测试类Test,以及一个实现了ImportBeanDefinitionRegistrar的类MyImportDBR

public interface ImportTestDao {
   
   
   public void query();
}
@Component
public class ImportTestService {
   
   
    @Autowired
    ImportTestDao importTestDao;
    public void find(){
   
   
        System.out.println("ImportTestService importTestDao.query()");
        importTestDao.query();
    }
}
@ComponentScan("com.demo")
public class AppConfig {
   
   
}
public <
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值