1、@Import概述:
@Import注解一般情况下是spring整合其他框架时使用到的,在使用@Component注解以及其组合组件的时候,这些组件是能被项目扫描到的,如果有其他的框架需要加载一些组件(这些组件不在项目的包中),可以使用@Import注解将其加载进来。注意:默认的@Import注入到组件的加载要先与当前的配置类,DeferredImportSelector的实现类除外。
2、@Import注解的用法:
@Import注解主要用三种使用方法
2.1、导入普通类
可以导入普通的类,也可以导入@Configuration注解的类,配置类将优先加载:
@Import(value = {Bean.class, Configuration.class})
2.2、导入ImportSelector接口的实现类
主要作用是收集需要导入的配置类,会将selectImports
方法返回的id的对象注入到Spring容器中。
SpringBoot的自动化配置和@EnableXXX注解一般都会使用这个,他可以依据参数来决定像容器中注入对应的bean。(从注解中获取的参数)
@Import(value = {CustomImportSelector.class})
public class CustomImportSelector implements ImportSelector {
// importingClassMetadata配置类上的所有注解元素
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 返回类的全限定类名,不管该类是不是Spring注解标注bean都会生成bean。
return new String[]{"com.xx.Bean"};
}
}
常用方式:
-
直接在配置类上使用@Import ImportSelector实现类
-
通过EnableXXX注解,在Enable注解上@Import ImportSelector实现类,然后我们再依据Eanble注解中的参数来判断需要加载哪个配置Bean到Spring容器中。
什么时候用?
-
需要自定义****@EnableXXX****类似功能的场景
-
需要批量的注入Bean的场景
2.3、导入ImportVeanDefinitionRegistrar接口实现类
ImportBeanDefinitionRegistrar也是一个接口,这个类只是注册Bean的方式可以更加自由,让我自己来创建BeanDefinition
并注册到容器中去。这个适合更加复杂的一些框架整合上,我们可以更加灵活的定制我们需要注入容器的bean元素。
@Import(value = {CustomImportSelector.class})
public class CustomBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
/**
* importingClassMetadata:配置类上的所有注解元素
* BeanDefinitionRegistry: 注册器,可以注入一些bean定义到容器中
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Bean.class);
registry.registerBeanDefinition("bean", rootBeanDefinition);
}
}