跟着小马哥学系列之 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 注解的类,也可以是普通的类。

总结

java小马哥是谁 小马哥spring源码_spring

注意:@Import 导入的类不一定是标注了 @Configuration 类,只是把它当成配置类。导入的类当成配置类,又可以获取配置类是否有 @Import 注解信息。