(一)IOC 容器:【6】@Import 系列—给容器中快速导入组件

注解

    给容器中注册方式:
    1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
    2)@Bean 导入第三方包里面的组件
    3)@Import:快速给容器中导入一个组件
       【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
       【2】ImportSelector:返回需要导入的 组件的全类名数组;
       【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中

  

一、注册组件

  给容器中注册组件有以下几种方式:

  (1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】

  (2)@Bean (适用于导入第三方包里面的组件)

  (3)@Import:快速给容器中导入一个组件

二、@Import 注解快速导入

  在配置类上面使用 @Import 注解可以快速给容器中导入组件:

@Import(value = {Color.class, Red.class})  //快速导入多个组件
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四", 20);
    }
}

  注意

    (1)配置类只能有一个 @Import 注解,不能出现多个;

    (2)导入的组件的 id 默认是组件的全类名

三、@ImportSelector

  ImportSelect 是一个接口,里面提供了一个方法 selectImports,用于返回要导入的组件的全类名数组。

  自定义一个 MyImportSelect 类,实现 ImportSelect 接口
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {

    /**
     * 返回值,就是要导入到容器中组件全类名
     * AnnotationMetadata:当前标注 @Import 注解的类的所有注解信息
     * @param importingClassMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        //方法不要返回 null 值,可以返回空数组
        return new String[]{"com.njf.bean.Yellow", "com.njf.bean.Blue"};
    }
}

  在配置类上进行应用:

@Import(value = {Color.class, Red.class, MyImportSelector.class})
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四", 20);
    }
}

  

四、@ImportBeanDefinitionRegistrar

  ImportBeanDefinitionRegistrar 是一个接口,它里面有一个registerBeanDefinition方法,用于向容器中注册一个组件。

  自定义一个MyImportBeanDefinitionRegistrar 类:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * AnnotationMetadata:当前类的注解信息
     * BeanDefinitionRegistry:Bean定义的注册类
     *   把所有需要添加到容器中的 bean,调用registerBeanDefinition方法进行手工注册
     *   BeanDefinitionRegistry.registerBeanDefinition
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean definition1 =  registry.containsBeanDefinition("com.njf.bean.Red");
        boolean definition2 =  registry.containsBeanDefinition("com.njf.bean.Blue");
        if (definition1 && definition2) {

            //beanDefinition  指定bean的类型,bean的定义信息,如类型,scope等信息
            RootBeanDefinition beanDefinition = new  RootBeanDefinition(RainBow.class);
            //注册一个bean,指定bean的名字
            registry.registerBeanDefinition("rainBow",  beanDefinition);
        }
    }
}

  在配置类上应用:

@Import(value = {Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四", 20);
    }
}

  测试结果:

原文地址:https://www.cnblogs.com/niujifei/p/15548918.html