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

导读:本篇文章讲解 SpringBoot学习笔记【part03】@Import 高级用法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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测试一下,没有问题。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84480.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!