一、@Import是什么?
@Import注解是Spring框架的注解,用于向Spring的IoC容器导入额外的组件。
二、@Import的作用
使用@Import注解可以实现
-
快速导入Bean到IOC容器中
快速地向Spring的IoC容器中导入一个或多个组件(第三方包 ),而不用使用标签在XML文件中手动定义。 -
控制是否注入该Bean,通过条件来控制注入哪些Bean到Spring容器中
当在@Configuration标注的类上使用@Import引入了一个类后,就会把该类注入容器中。
当然除了@Configuration 比如@Component、@Service等一样也可以。
三、@Import的特点
- @Import只能用在类上或者配置类上
四、@Import的应用
比如以下熟悉的注解等统一采用的都是借助@Import注解来实现的。
- @EnableAsync
- @EnableCaching
- @EnableScheduling
五、 @Import有三种使用方式
5.1、直接填class数组方式,指定要导入的组件的类
使用时,可以将一个或多个要导入的组件的全类名数组传递给@Import注解的value属性
@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
直接填对应的class数组,class数组可以有0到多个。
语法如下:
@Import({
类名.class , 类名.class... })
public class TestDemo {
}
@Import(value={
Cat.class,Dog.class})
public class AnimalConfiguration {
}
对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.XXXXXXX.类名
5.2、ImportSelector方式【重点】
使用ImportSelector接口来返回要需要导入的组件的全类名数组。
@Import(AnimalImportSelector.class)
public class AnimalConfiguration {
}
public class AnimalImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
Cat.class.getName(), Dog.class.getName()};
}
}
SpringBoot底层源码用的特别多
比如@EnableAutoConfiguration注解的源码
- 开启自动配置,在项目启动时,向IOC容器中快速注入Bean 而已。
- @EnableAutoConfiguration 注解作用:@Import 的一种形式
源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
看到有个 @Import
注解,使用的是ImportSelector的方式
5.3、ImportBeanDefinitionRegistrar方式
使用ImportBeanDefinitionRegistrar接口来返回要导入的组件的全类名数组,属于手动注册bean到容器。
@Import(AnimalImportBeanDefinitionRegistrar.class)
public class AnimalConfiguration {
}
public class AnimalImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition(Cat.class.getName(), new RootBeanDefinition(Cat.class));
registry.registerBeanDefinition(Dog.class.getName(), new RootBeanDefinition(Dog.class));
}
}
六、参考文章
https://www.cnblogs.com/lm970585581/p/13066139.html
转载:https://blog.csdn.net/wstever/article/details/128594733