Spring注解驱动-@Import组件导入

一)@Import注解的使用

@Import注解是和@Bean注解一样的都是创建一个的bean对象
相比于@Bean @Import的导入方式更简便,但是实际的功能是和@Bean一致的
使用的方法在类注解上导入一个类
使用@Import导入的方式bean的名称默认为类的全类名

@Configuration
@Import(value = {Color.class, Red.class})
public class MyConfiguration2 {
    /**
     * 需求根据操作系统进行创建对象
     *

Spring注解驱动-@Import组件导入_第1张图片

导入的方式创建bean对象,对象的ID值默认为类的全类名
Spring注解驱动-@Import组件导入_第2张图片

二)导入的第二种解决办法

ImportSelector接口批量导入
实现批量导入需要实现接口ImportSelector接口

/**
 * @project_name:hibernate02
 * @date:2019/8/18:16:05
 * @author:shinelon
 * @Describe: import批量导入
 */
public class MyImportSelector implements ImportSelector {


    /**
     * @param annotationMetadata  用用于获取Improt注解注解的类的所有注解信息
     * @description:
     * @return:
     * @author: shinelon
     * @time: 2019/8/18:16:06
     */
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[0]; //返回的是个数组
    }
}

DEBUG下的annotationMetadata变量存的值

Spring注解驱动-@Import组件导入_第3张图片

使用Importselector接口实现组件的导入,直接返回类的全类名即可实现类的导入

/**
 * @project_name:hibernate02
 * @date:2019/8/18:16:05
 * @author:shinelon
 * @Describe: import批量导入
 */
public class MyImportSelector implements ImportSelector {


    /**
     * @param annotationMetadata  用用于获取Improt注解注解的类的所有注解信息
     * @description:
     * @return:
     * @author: shinelon
     * @time: 2019/8/18:16:06
     */
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //直接添加类的全类名即可
        return new String[]{"com.itguigu.pojo.Blue","com.itguigu.pojo.Yellow"};
    }
}

实现导入的结果

Spring注解驱动-@Import组件导入_第4张图片

三)第三种导入方式

第三种导入方法ImportBeanDefinitionRegistrar实现导入
使用接口ImportBeanDefinitionRegistrar实现导入

/**
 * @project_name:hibernate02
 * @date:2019/8/18:18:37
 * @author:shinelon
 * @Describe:ImportBeanDefinitionRegistrar  接口实现bean的创建
 */
public class MyImportBean implements ImportBeanDefinitionRegistrar {

    /**
     * @param beanDefinitionRegistry  注册工厂是该对象进行bean的注册
     * @param annotationMetadata 获取的是当前类的注解相关
     * @description:
     * @return:
     * @author: shinelon
     * @time: 2019/8/18:18:38
     */
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        //注册一个的bean使用BeanDefinition实现类的RootBeanDefinition进行创建一个bean

        /**
         * 判断实现注册如果包含了red和color就创建Rainbow对象
         */
        if(beanDefinitionRegistry.containsBeanDefinition("com.itguigu.pojo.Red")&&beanDefinitionRegistry.containsBeanDefinition("com.itguigu.pojo.Color")){
            beanDefinitionRegistry.registerBeanDefinition("Rainbow",new RootBeanDefinition(RainBow.class));
        }
    }
}

测试类

@Test
public void test3() {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration2.class);
    printName(context);
}


public void printName(AnnotationConfigApplicationContext context) {
    String[] names = context.getBeanDefinitionNames();
    for (String name : names
    ) {
        System.out.println(name);
    }
}

Spring注解驱动-@Import组件导入_第5张图片

你可能感兴趣的:(Spring)