Spring注解学习_组件注册4_@Import

  1. @Import(XXX.class)
  2. @Import(ImportSelector.class)
  3. @Import(ImportBeanDefinitionRegistrar.class)

到目前为止,我们所学习的给IOC容器中注册组件的方法有:

  • 包扫描(@ComponentScan(“package_path”))+ 组件标注注解(@Controller, @Service, @Repository, @Component):导入我们自定义的组件
  • @Bean:可用于导入第三方包里面的组件
  • @Import:快速给容器导入一个组件
    • @Import(要导入到容器中的组件.class),容器中就会自动注册这个组件id默认为全类名
    • ImportSelector,自定义实现ImportSelector的selectImports方法,返回String[]数组对象,内携带要导入容器的类的全类名
    • ImportBeanDefinitionRegistrar:手动注册bean到容器中

@Import(XXX.class)

随便建一个类

image-20200329154732986

快速导入@Import

@Configuration
@Import(Color.class)
public class MainConfig2 {
    ...
}

测试:

ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
@Test
public void testImport(){
    String[] names = context.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }
}

image-20200329154521386

@Import(ImportSelector.class)

此法在SpringBoot源码中用得较多

实现ImportSelector接口

public class MyImportSelector implements ImportSelector {
    /**
     * 自定义返回需要的组件
     * @param annotationMetadata 当前@Import注解所标注类的所有注解信息
     * @return 返回值就是要导入到容器中组件的全类目,不能返回null
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.study.bean.Blue","com.study.bean.Green", "com.study.bean.Yellow"};
    }
}

导入我们自定义的ImportSelector

@Configuration
@Import({
    Color.class,
    MyImportSelector.class
})
public class MainConfig2 {
    ...
}

测试:

ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
@Test
public void testImport(){
    String[] names = context.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }
}

结果:

image-20200329164650715

@Import(ImportBeanDefinitionRegistrar.class)

可以通过运行时Bean注册信息判断并选择导入组件,此法较为少用

实现ImportBeanDefinitionRegistrar接口:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * 把所有需要添加到容器中的bean,调用BeanDefinitionRegistrar.registerBeanDefinition方法手动注册进来
     * @param importingClassMetadata 当前类的注解信息
     * @param registry  BeanDefinition注册类
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean green = registry.containsBeanDefinition("com.study.bean.Green");
        boolean blue = registry.containsBeanDefinition("com.study.bean.Blue");
        //如果容器中已有green和blue
        if (green&&blue){
            //指定bean注册信息和名称,注册新的bean
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rainbow.class);
            registry.registerBeanDefinition("rainBow",rootBeanDefinition);
        }
    }
}

导入我们自定义的ImportBeanDefinitionRegistrar

@Configuration
@Import({
        Color.class,
        MyImportSelector.class,
        MyImportBeanDefinitionRegistrar.class
})
public class MainConfig2 {
    ...
}

结果:

image-20200329171235595


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_组件注册4_@Import

文章字数:513

本文作者:梅罢葛

发布时间:2020-03-29, 15:33:06

最后更新:2020-03-29, 18:37:21

原始链接:https://qiurungeng.github.io/2020/03/29/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-Import/
目录
×

喜欢就点赞,疼爱就打赏