SpringBoot学习笔记【part03】@Import 高级用法

SpringBoot 学习笔记 Part03

1. @Import 基本用法回顾

@Import注解的基本用法是在注解属性中加入要导入到容器中的组件字节码,容器中就会自动注册这个组件。简单来说,就是快速给容器中注册组件。

给容器中注册组件的三种方式回顾:

  1. 包扫描+组件标注注解(@Component/@Controller/@Service/@Repository)

    这种方式局限于自己写的,因为在第三方包源码里加注解不那么现实。

  2. @Bean

    多用于第三包里面的组件。

  3. @Import

    快速给容器中导入一个组件,id默认是全类名。


2. ImportSelector接口

ImportSelector 作用是返回需要导入的组件的全类名数组,用法可以总结为两个步骤。

第一步:创建ImportSelector接口的实现类,这个类可以自定义逻辑返回需要导入的组件。

参数1 AnnotationMetadata类:
    存储了当前标注@Import注解的类的所有注解信息。(即MyConfig.java的信息)
    
    
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {

        //AnnotationMetadata类 存储了当前标注@Import注解的类的所有注解信息
		Set<String> annotationTypes = annotationMetadata.getAnnotationTypes();
        
		//返回值为导入到容器中的组件全类名(可以返回一个空数组,但是千万不能返回一个null)
        return new String[0];
    }
}

返回值可以用组件全类名来导入组件到容器中,这也是ImportSelector的一个重要功能。

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {

        return new String[]{"com.swz.domain.Blue","com.swz.domain.Yellow"};
    }
}

annotationMetadata.get*( )方法可以获取所有注解的属性或者所有跟类有关的信息。

在这里插入图片描述


第二步:在@Import注解中加入我们新建的自定义导入选择器。

@Import({Car.class,MyImportSelector.class})
@Configuration
public class MyConfig {
}

启动springboot测试一波,没有任何问题。

在这里插入图片描述

在这里插入图片描述


3. ImportBeanDefinitionRegistrar接口

这个接口和上一个接口比较明显的区别是,上一个接口指定全类名,springboot以全类名为id自动为你创建。而 ImportBeanDefinitionRegistrar 这个接口则是我们手动注册了,包括手动指定bean的id和bean的字节码文件。

步骤也是和前一个接口类似,一共两步。

第一步:创建ImportBeanDefinitionRegistrar 接口的实现类,使用registry.registerBeanDefinition()方法来手动注册组件,其中第一个参数为组件的beanid,第二个参数为一个匿名内部类,传入需要创建的bean的字节码文件。

参数1 AnnotationMetadata类
    存储了当前标注@Import注解的类所有注解信息和其他信息(即MyConfig.java的信息)。
参数2 BeanDefinitionRegistryBeanDefinition的注册类。可以把所有需要添加到容器中的bean,通过调用registerBeanDefinition手动注册进来。
    
    
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        //业务逻辑:若容器中有Blue和Yellow对象时,则创建rainbow对象进容器
        boolean isContains1 = registry.containsBeanDefinition("com.swz.domain.Blue");
        boolean isContains2 = registry.containsBeanDefinition("com.swz.domain.Yellow");
        if(isContains1 && isContains2){
            registry.registerBeanDefinition("rainbow",new RootBeanDefinition(Rainbow.class));
        }

    }
}

第二步:在@Import注解中加入我们新建的自定义Bean注册器。
@Import({Car.class,MyImportSelector.class,MyBeanDefinitionRegistrar.class})
@Configuration
public class MyConfig {
}

启动springboot测试一下,没有问题。

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Parker7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值