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

快速导入@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);
}
}

¶@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);
}
}
结果:

¶@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 {
...
}
结果:

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 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/