一、@Import解释
@Import只能用在类上 @Import通过快速导入的方式实现把实例加入spring的IOC容器中 @Import注解可以用于导入第三方包
二、@Import有三种使用方法
@Import的三种用法: 1、直接填class数组方式
直接填对应的class数组,class数组可以有0到多个
@Configuration @Import({Cat.class,Person.class}) public class MyConfig { }
import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名
可以从ioc容器中取出来
@Autowired private Person person; @Test public void testImport() { System.out.println(person); }
这种方式要实现ImportSelector接口。
创建MyImportSelector并实现ImportSelector接口
public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //获取被import的类上的所有注解 SetannotationTypes = annotationMetadata.getAnnotationTypes(); System.out.println(annotationTypes); return new String[]{"com.gly.im.Cat"}; } }
将此实现类MyImportSelector添加到容器中
@Configuration @Import({MyImportSelector.class,Person.class}) public class MyConfig { }
将Cat和Person都会注册到ioc容器中
测试
@Autowired private Person person; @Autowired private Cat cat; @Test public void testImport() { System.out.println(person); }
实现接口的selectImports方法中需要注意三点
返回值: 实际上要导入到容器中的组件全类名 参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息 需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!
创建MyImportBeanDefinitionRegistrar接口
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class); registry.registerBeanDefinition("cat",rootBeanDefinition); } }
将此实现类MyImportBeanDefinitionRegistrar添加到容器中
@Configuration @Import({MyImportSelector.class,Person.class,MyImportBeanDefinitionRegistrar.class}) public class MyConfig { }
测试
@Autowired private Person person; @Autowired private Cat cat; @Test public void testImport() { System.out.println(person); System.out.println(cat); }
registerBeanDefinitions参数解释:
annotationMetadata 和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息 registry第二个参数表示用于注册定义一个bean
以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式