SpringBoot-注解@Import
参考文献
@Import
使用
1 | // org.springframework.context.annotation.Import |
- 允许通过它引入
@Configuration
标注的类,引入ImportSelector
接口和ImportBeanDefinitionRegistrar
接口的实现,也包括@Component注解
的普通类。 @Import
可以用来批量导入需要注册的各种类,如普通的类、配置类,完后完成普通类和配置类中所有bean的注册。
@Import
的value
常见用法
-
value
为普通类 -
value
为@Configuration
标注的类 -
value
为@ComponentScan
标注的类 -
value
为ImportBeanDefinitionRegistrar
接口类型- 定义
ImportBeanDefinitionRegistrar
接口实现类,在registerBeanDefinitions
方法中使用registry来注册bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class MyImportBeanDefinitionRegistrar implements
ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata
importingClassMetadata, BeanDefinitionRegistry registry) {
//定义一个bean:Service1
BeanDefinition service1BeanDinition =
BeanDefinitionBuilder.genericBeanDefinition(Service1.class).getBeanDefinition();
//注册bean
registry.registerBeanDefinition("service1", service1BeanDinition);
//定义一个bean:Service2,通过addPropertyReference注入service1
BeanDefinition service2BeanDinition =
BeanDefinitionBuilder.genericBeanDefinition(Service2.class).
addPropertyReference("service1", "service1").
getBeanDefinition();
//注册bean
registry.registerBeanDefinition("service2", service2BeanDinition);
}
} - 定义
-
使用
@Import
来导入步骤1中定义的类 -
使用步骤2中
@Import
标注的类作为AnnotationConfigApplicationContext
构造参数创建spring容器 -
使用
AnnotationConfigApplicationContext
操作bean
-
value
为ImportSelector
接口类型-
定义
ImportSelector
接口实现类,在selectImports
返回需要导入的类的名称数组1
2
3
4
5
6
7
8
9public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
Service1.class.getName(),
Module1Config.class.getName()
};
}
} -
使用
@Import
来导入步骤1中定义的类 -
使用步骤2中
@Import
标注的类作为AnnotationConfigApplicationContext
构造参数创建spring容
器 -
使用
AnnotationConfigApplicationContext
操作bean
-
-
value
为DeferredImportSelector
接口类型DeferredImportSelector
是ImportSelector
的子接口,既然是ImportSelector
的子接口,所以也可以通过@Import
进行导入,这个接口和ImportSelector
不同地方有两点- 延迟导入
- 比如
@Import
的value包含了多个普通类、多个@Configuration
标注的配置类、多个ImportSelector
接口的实现类,多个ImportBeanDefinitionRegistrar
接口的实现类,还有DeferredImportSelector
接口实现类,此时spring处理这些被导入的类的时候,会将DeferredImportSelector
类型的放在最后处理, 会先处理其他被导入的类,其他类会按照value所在的前后顺序进行处理。
- 比如
- 按序导入
- 实现
Order
接口
- 实现
- 延迟导入
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!