@Import注解修饰配置类,作用是快速给容器中导入一个组件,容器中自动注册这个组件,id是默认全类名
1.@Import属性值为需注册到容器中的bean类
@Import({Color.class})修饰配置类,要导入容器是Color.java实例(组件)
@Configuration
@Import({Color.class})
public class MainConfig {
}
自定义一个java类(需要注册到容器中的类,也就是组件)
public class Color {
}
测试方法:
@Test
public void testImport(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println("====="+name);
}
}
测试结果:
=====mainConfig2
=====com.atguigu.bean.Color
2.@Import(value={xxxx})注解的value值为自定义的选择器类,此选择器实现ImportSelector接口
选择器通过全类名选择需要实例化的组件。
1)@Import({MyImportSelector.class})修饰配置类:其value值为自定义的选择器类 MyImportSelector.class
@Configuration
@Import({MyImportSelector.class})
public class MainConfig {
}
2)编制选择器类,通过方法selectImports,选择需要的bean类注册到容器
通过bean类的全类名进行选择,本例中选择两个例:com.rsd.bean.Blue com.rsd.bean.Yellow
return new String[]{"com.rsd.bean.Blue","com.rsd.bean.Yellow"};
public class MyImportSelector implements ImportSelector {
/**
* AnnotationMetadata:当前配置类的所有注解(指修饰类的注解)信息。
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.rsd.bean.Blue","com.rsd.bean.Yellow"};
}
}
3)编制两个需要实例化的类:Blue.java Yellow.java
package com.rsd.bean;
public class Blue {
}
package com.rsd.bean;
public class Yellow {
}
测试例与1相同:
运行结果:=====mainConfig2
=====com.rsd.bean.Blue
=====com.rsd.bean.Yellow
3.@Import(value={xxxx})注解的value值为自定义的注册类,此选择器实现ImportBeanDefinitionRegistrar接口,
通过手动将bean类注册到容器中
1)@Import(value={MyImportBeanDefinitonRegistrar.class})注解的属性值为自定义的bean注册实现类
@Configuration
@Import(value={MyImportBeanDefinitonRegistrar.class})
public class MainConfig {
}
2)注册类中通过registry对象将RainBow类手动注册至容器
public class MyImportBeanDefinitonRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
3)需要注册到容器中bean类
package com.atguigu.bean;
public class RainBow {
}
测试案例与以上相同:
运行结果为
=====mainConfig2
=====rainBow