跟着小马哥学系列之 Spring IoC(源码篇:@Import)

学成路更宽,吊打面试官。 ——小马哥

简介

大家好,我是小马哥成千上万粉丝中的一员!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 注解信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿大叔文海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值