加入IOC容器的方式有很多种,其中@Import注解通过快速导入的方式实现把bean实例加入spring的IOC容器中,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷,@Import的三种用法:
- 直接填class数组方式
- ImportSelector方式【重点】
- ImportBeanDefinitionRegistrar方式
注意:@Import只能用在类类、接口、注解上
1.@Import直接填加class数组
直接填加对应的class数组,class数组可以有0到多个,使用方式如下:
@Import({类名.class , 类名.class...})
public class ImportDemo {
}
@Import注解添加的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名
2.ImportSelector方式
ImportSelector方式的前提就是一个添加的类要实现ImportSelector接口,例如:Myclass这个类,分析具体如下:
创建Myclass类并实现ImportSelector接口
@Import(Myclass.class)
public class MyTest {
}
public class Myclass implements ImportSelector {
// 既然是接口肯定要实现这个接口的方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{TestDemo.class.getName()};
}
}
分析实现接口的selectImports方法,其中
- 参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息,如@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)
- 返回值: 就是我们实际上要导入到容器中的组件全类名,如:return new String[]{TestDemo.class.getName()};
注意:selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!
3.ImportBeanDefinitionRegistrar方式
ImportBeanDefinitionRegistrar接口类似于第二种ImportSelector用法,只不过多了自定义注册的功能。
@Import(Myclass2.class)
public class MyTest2 {
}
public class Myclass2 implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
// 指定bean定义信息(包括bean的类型、作用域...)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo.class);
// 注册一个bean指定bean名字(id)
beanDefinitionRegistry.registerBeanDefinition("testDemo",rootBeanDefinition);
}
}
registerBeanDefinitions参数分析:
- 第一个参数:AnnotationMetadata和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息
- 第二个参数:BeanDefinitionRegistry表示bean定义注册器,可用于注册定义一个bean
4、@Import注解的三种使用方式总结
第一种用法:
@Import
({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名第二种用法:
ImportSelector
:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】,例如@EnableAutoConfiguration第三种用法:
ImportBeanDefinitionRegistrar
:手动注册bean到容器,例如@MapperScan
以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。
@Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握!