该注解只能在类上使用,通过该注解可以把实例注入容器中
源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* The @{@link Configuration}, {@link ImportSelector} and/or
* {@link ImportBeanDefinitionRegistrar} classes to import.
*/
Class<?>[] value();
}
从源码可以看出,该注解唯一参数value有三种取值:Configuration,ImportSelector,ImportBeanDefinitionRegistrar
一、Configuration
最简单,直接写即可
@Configuration
//spring4.2.0之后可用
@Import(value = { 待注入的类.class })
public class MainConfig7 {
}
二、ImportSelector
需要定义一个自己的类,实现ImportSelector接口
public class MyImportSelector implements ImportSelector{
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//自定义不能返回为null,会报错
//@Import(value = { selectImports.class })后就会将该类注入到容器中
return new String[]{"com.zc.Dog","com.zc.Cat"};
}
}
然后用法和一一样,直接导入即可
三、ImportBeanDefinitionRegistrar
自定义一个类实现ImportBeanDefinitionRegistrar接口
public class MyImportBeanDefinintonRegistrar implements ImportBeanDefinitionRegistrar{
/*
AnnotationMetadata:当前类的注解信息
BeanDefinitionRegistry:BeanDefinition的注册类
把所有需要添加到容器中的Bean加入
* */
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//从容器中拿Dog对象
boolean bean1 = registry.containsBeanDefinition("com.zc.Dog");
//待注册的bean,要先封装
if(bean1){
new RootBeanDefinition(Pig.class);
registry.removeBeanDefinition("Pig");
}
}
}
再@Import({Dog.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})即可