跟着小马哥学系列之 Spring IoC(源码篇:@Import)
- 简介
- @ Import 简介
- 元信息
- 元注解
- 属性
- @Import 注解 value 属性取值范围
- ImportSelector
- ImportBeanDefinitionRegistrar
- 配置类
- 总结
学成路更宽,吊打面试官。 ——小马哥
简介
大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间《小马哥讲Spring核心编程思想》基础上形成的个人一些总结。希望能帮助各位小伙伴, 祝小伙伴早日学有所成。 分为基础篇、进阶篇、源码篇。玩游戏看颜色,学技术看版本,本系列以 Spring 5.2.2.RELEASE 版本为基础进行介绍。 祝小伙伴早日学有所成。
@ Import 简介
- 表示要导入的一个或多个组件类——通常为 @Configuration 类。
- 提供等同于 Spring XML 中的 <import/> 元素的功能。允许导入 @Configuration 类,ImportSelector 和ImportBeanDefinitionRegistrar 实现,以及常规组件类(从 4.2 开始;类似于 AnnotationConfigApplicationContext.register(Class<?>…)。
- 在导入的 @Configuration 类中声明的 @Bean 定义应该通过使用 @Autowired 注入来访问。要么 bean 本身可以自动装配,要么声明 bean 的配置类实例可以自动装配。后一种方法允许在 @Configuration 类方法之间进行显式的 IDE 友好导航。
- 可以在类级别声明,也可以作为元注解声明。
- 如果需要导入 XML 或其他非 @Configuration bean 定义资源,则使用 @ImportResource 注解。
元信息
元注解
- Target(ElementType.TYPE):注解可以标注在类、接口(包括注释类型)或枚举上
- Retention(RetentionPolicy.RUNTIME):注解将被编译器记录在类文件中,并在运行时由 VM 保留,因此它们可以被反射读取
- Documented:生成 javadoc 时会显示该注解信息
属性
- Class<?> value():@Configuration, ImportSelector, ImportBeanDefinitionRegistrar,或要导入的常规组件类
@Import 注解 value 属性取值范围
ImportSelector
- 该接口根据给定的选择标准(通常是一个或多个注解属性)确定应该导入哪个 @Configuration 类。
- ImportSelector 可以实现以下任意一个 Aware 接口,并且它们各自的方法会在 selectImports() 之前被调用:
- EnvironmentAware
- BeanFactoryAware
- BeanClassLoaderAware
- ResourceLoaderAware
- 或者,类可以提供一个具有以下支持的一个或多个参数类型的构造函数:
- Environment
- BeanFactory
- ClassLoader
- ResourceLoader
方法 | 描述 |
String[] selectImports(AnnotationMetadata importingClassMetadata) | 根据导入的 @Configuration 类的 AnnotationMetadata 选择并返回应该导入的类的名称 |
Predicate<String> getExclusionFilter() | 返回一个谓词,用于从导入候选对象中排除类,过渡应用于通过此选择器的导入找到的所有类。如果该谓词对于给定的完全限定类名返回true,则所述类将不会被视为导入的配置类,从而绕过类文件加载和元数据自检。 |
ImportBeanDefinitionRegistrar
- 接口,由在处理 @Configuration 类时注册附加 bean 定义的类型实现。当需要或必须在 bean 定义级别(相对于 @Bean 方法/实例级别)进行操作时非常有用。
- 与 @Configuration 和 ImportSelector 一样,这种类型的类也可以提供给 @Import 注解(或者也可以从 ImportSelector 返回)。
- ImportBeanDefinitionRegistrar 可以实现以下任何一个 Aware 接口,它们各自的方法将在registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator)之前被调用:
- EnvironmentAware
- BeanFactoryAware
- BeanClassLoaderAware
- ResourceLoaderAware
- 或者,类可以提供一个具有以下支持的一个或多个参数类型的构造函数:
- Environment
- BeanFactory
- ClassLoader
- ResourceLoader
方法 | 描述 |
void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator imoprotBeanNameGenerator) | 必要时根据导入 @Configuration 类的给定注解元数据注册 bean 定义。注意,由于与 @Configuration 类处理相关的生命周期约束,BeanDefinitionRegistryPostProcessor 类型可能不会在这里注册。默认实现委托 registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry) |
void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) | 同上 |
配置类
可以是被标注 @Configuration 注解的类,也可以是普通的类。
总结
注意:@Import 导入的类不一定是标注了 @Configuration 类,只是把它当成配置类。导入的类当成配置类,又可以获取配置类是否有 @Import 注解信息。