@Import @ImportSelector@ImportBeanDefinitionRegistrar给容器快速导入组件

给容器中注册组件的方式
1.@ComponentScan包扫描+组件标注注解(@Contrller@Service@Respository)
2.@Bean
3.@Import 快速给容器中导入一个组件,可以用于导入第三方包,只能用在类上
@Import({RedColor.class , BlueColor.class}) id默认是全类名
@Import({MyImportSelector.class})返回需要导入的组件的全类名数组
@Import({MyImportBeanDefinitionRegistrar.class}),手动注册到spring容器

4.@FactoryBean
新建一个maven项目,导入jar包

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>

</dependencies> 

第一种用法:直接填class数组
直接填对应的class数组,class数组可以有0到多个。

@Configurable
@Import({RedColor.class , BlueColor.class})
public class MainConfig {

    @Bean
    public Person person() {
        return  new Person("windows",20);
    }
}
public class RedColor {
}
public class BlueColor {
}
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanNamesForType = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanNamesForType.length; i++) {
            System.out.println(beanNamesForType[i]);
        }
    }

结果
在这里插入图片描述
第二种用法:ImportSelector方式【重点】
这种方式的前提就是一个类要实现ImportSelector接口

@Configurable
@Import({RedColor.class , BlueColor.class, MyImportSelector.class})
public class MainConfig {

    @Bean
    public Person person() {
        return  new Person("windows",20);
    }
}
public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.my.bean.DogAnimal","com.my.bean.CatAnimal"};
    }
}
public class CatAnimal {
}
public class DogAnimal {
}
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanNamesForType = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanNamesForType.length; i++) {
            System.out.println(beanNamesForType[i]);
        }
    }

在这里插入图片描述
第三种用法:ImportBeanDefinitionRegistrar方式
同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册

在这里插入代码片
@Configurable
@Import({RedColor.class , BlueColor.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig {

    @Bean
    public Person person() {
        return  new Person("windows",20);
    }
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean redColor = registry.containsBeanDefinition("com.my.bean.RedColor");
        boolean blueColor = registry.containsBeanDefinition("com.my.bean.BlueColor");
        if(redColor&&blueColor){
            RootBeanDefinition beanDefinition = new RootBeanDefinition(RainColor.class) ;
            registry.registerBeanDefinition("rainColor",beanDefinition);
        }
    }
}
public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanNamesForType = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanNamesForType.length; i++) {
            System.out.println(beanNamesForType[i]);
        }
    }

}

在这里插入图片描述

第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

展开阅读全文
©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读