4.@Import

常用的导入注解分类:

  1. 注册自己写的类service、dao、controller可用包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)

  2. @Bean[导入的第三方包里面的组件]

  3. @Import[快速给容器中导入一个组件]

    1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
    2)、ImportSelector:返回需要导入的组件的全类名数组;
    3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
4.1 @Import

新建实体类Animal、Cat、Dog来测试

9fbALF.png

配置类 ImportConfig

/**
 * @author GaoYuzhe
 * @date 2018/3/13.
 */
//注入Animal对象
@Import(Animal.class)
@Configuration
public class ImportConfig {
}

测试类

/**
 * @author GaoYuzhe
 * @date 2018/3/13.
 */
public class ImportConfigTest {
    AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportConfig.class);
    /**
     * 遍历匹配的组件名称
     * @param annotationConfigApplicationContext 注解上下文
     */
    private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println("匹配的类"+beanDefinitionNames[i]);
        }
    }
    @Test
    public void testImport(){
        printClassName(annotationConfigApplicationContext);
    }

}

运行结果:可用看到容器中注册了Animal对象,id为全类名

@Import

4.2@ImportSelector

自定义导入选择器,需要实现ImportSelector接口,重写selectImports(AnnotationMetadata importingClassMetadata)方法返回一个全类名的数组,注意不能返回null,不然会报NullPointException

/**
 * 自定义导入选择器
 * @author GaoYuzhe
 * @date 2018/3/13.
 */
public class MyImportSelecttor implements ImportSelector{
    /**
     *
     * @param importingClassMetadata 加@Import注解的类,所有注解信息
     * @return
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //当前类的所有注解
        Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
        System.out.println("当前配置类的注解信息:"+annotationTypes);
        //注意不能返回null,不然会报NullPointException
        System.out.println("注册了com.gaoyuzhe.pojo.Cat");
        return new String[]{"com.gaoyuzhe.pojo.Cat"};
    }

配置类注解

@Import({Animal.class, MyImportSelecttor.class})

运行结果,测试方法同4.1

ImportSelector运行结果

4.3@ImportBeanDefinitionRegistrar

MyImportBeanDefinitionRegistrar 自定义ImportBeanDefinitionRegistrar

实现ImportBeanDefinitionRegistrar接口

**
 * @author GaoYuzhe
 * @date 2018/3/13.
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    /**
     * 注册bean
     * @param importingClassMetadata 当前类的信息
     * @param registry Bean注册器
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        /**
         * BeanDefinition可以设置组件的多个信息
         * 例如:
         * setBeanClassName 设置bean的全类名
         * setScope 设置bean的作用域
         */
        BeanDefinition beanDefinition =new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.gaoyuzhe.pojo.Dog");
        beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        //判断容器中是否注册Cat对象,如果有则注册Dog
        if(registry.containsBeanDefinition("com.gaoyuzhe.pojo.Cat")){
            //beanName为在容器中的id
            registry.registerBeanDefinition("Dog",beanDefinition);
        }
    }
}

配置类注解

@Import({Animal.class, MyImportSelecttor.class, MyImportBeanDefinitionRegistrar.class})

运行结果,测试方法同4.1

MyImportBeanDefinitionRegistrar运行结果

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐