@Import注解也是在SpringBoot中使用非常频繁的一个注解,还有相似功能的一系列注解:@ImportSelector、@DeffredImportSelector、@ConditionalOnBean、@ConditionalOnClass等等的众多导入功能的注解,实现了SpringBoot中的各种高级功能。
@Import注解的作用是快速导入某一个或多个类,使这些类能够被Spring加载到IOC容器中进行管理,使用在标注@Configuration注解的类上,使用@Import引入普通类,实现了ImportSelector接口或ImportBeanDefinitionRegistrar接口的实现类。
常用的三种使用方法:
1、@Import({ 类名1.class , 类名2.class… })
2、@Import({ ImportSelectorXXX1.class , ImportSelectorXXX2.class… })
3、@Import({ ImportBeanDefinitionRegistrarXXX1.class , ImportBeanDefinitionRegistrarXXX2.class… })
1、@Import直接引入类
格式:@Import({ 类名1.class , 类名2.class… })
/**
* Import的使用
*/
@Import({Person2.class})
@Configuration
public class SpringBootConfiguration_4 {
}
2、ImportSelector自定义引入
1)自定义一个引入类,实现ImportSelector接口,并重写selectImports方法
public class ImportPerson3 implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.itzhimei.handle.Person3"};
}
}
这里返回的就是要加载到ioc的类,可以是一个或多个,指定的类要是类全限定类名,例如:”com.itzhimei.handle.Person3″}。
2)在配置类的@Import中引入自定义类
/**
* ImportSelector的使用
*/
@Import({ImportPerson3.class})
@Configuration
public class SpringBootConfiguration_5 {
}
3、ImportBeanDefinitionRegistrar自定义注册bean
1)自定义一个引入类,实现ImportBeanDefinitionRegistrar接口,并重写registerBeanDefinitions方法
public class ImportPerson4Reg implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//指定bean定义信息(包括bean的类型、作用域...)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person4.class);
//注册一个bean并指定bean的id
registry.registerBeanDefinition("Person4",rootBeanDefinition);
}
}
2)在配置类的@Import中引入自定义类
/**
* ImportBeanDefinitionRegistrar的使用
*/
@Import({ImportPerson4Reg.class})
@Configuration
public class SpringBootConfiguration_6 {
}
我们从上面的例子可以看到使用ImportSelector和ImportBeanDefinitionRegistrar自定义的import,最后都需要使用@Import引入。
ImportSelector和ImportBeanDefinitionRegistrar在实际开发中的使用,比上面演示的会复杂一些,我们后续章节来介绍。