一线大牛带你深入解析AutoConfiguration源码
AutoConfiguration lmportSelector源码解析@EnableAutoConfiguration 的关键功能是通过@Import 注解导入的 ImportSelector 来完成的从 源 代码得知@lmport(AutoConfigurationlmportSelector.class) 是@EnableAutoConfiguration 注 解 的 组成部分,也是自动配置功能的核心实现者。
@Ilmport(AutoConfigurationlmportSele-ctor.class)又可以分为两部分:
@Ilmport 和对应的 ImportSelector 。
本节重点讲解@lmport 的基本使用方法和ImportSelector 的实现类 AutoConfigurationlmportSelector 。
@Import 注解
@lmport 注解位于 spring-context 项目内 , 主要提供导入配置类的功能 。
为什么要专门讲解@lmport 的功能及使用呢?如果查看 Spring Boot 的源代码 , 我们会发现大量的 EnableXXX 类都使用了该注解 。 了 解@lmport 注解的基本使用方法 , 能够帮助我们更好地进行源代码的阅读和理解 。
@lmport 的源码如下 。
@Target(ElementType.TYPE)@Retention(RetentionPolicy. RUNTIME)@Documentedpublic @interface Import {Class>[] value();}
@lmport 的作用和 xml 配置中
关于@lmport 导入@Configuration 注解类和 POJO 的功能比较简单和常见 , 就不再展开介绍了 。 下面重点介绍 ImportSelector 接口的作用 。
ImportSelector 接口
@Import 的许多功能都需要借助接口 ImportSelector 来实现,ImportSelector 决定可引入哪些@Configuration 。 ImportSelector 接口源码如下 。
public interface ImportSelectorString[] selectImports (AnnotationMetadata importingClassMetadata);}
ImportSelector 接口只提供了一个 参数为 AnnotationMetadata 的方法 , 返回的结果为一个字符串数组 。 其中参数 AnnotationMetadata 内包含了被@lmport 注解的类的注解信息 。 在selectlmports 方法内可根据具体实现决定返回哪些配置类的全限定名 , 将结果以字符串数组的形式返回 。
如果实现了接口 ImportSelector 的类的同时又实现了以下 4 个 Aware 接口 , 那么 Spring 保证 在 调 用 ImportSelector 之 前 会 先 调 用 Aware 接 口 的 方 法。这 4 个 接 口 为 :
EnvironmentAware 、 BeanFactoryAware 、 BeanClassLoaderAware 和 ResourceLoaderAware.
在 AutoConfigurationlmportSelector 的源代码中就实现了这 4 个接口 , 部分源代码及 Aware的全限定名代码如下 。
import org. springframework. beans. factory . BeanClassLoaderAware;import org. springframework . beans . factory . BeanFactoryAware;import org. springframework. context. EnvironmentAware;import org. springframework. context. ResourceLoaderAware;import org. springframework. context . annotation.DeferredImportSelector;import org. springframework . core . Ordered;public class AutoConfigurat ionImportSelectorimplements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,BeanF actoryAware, EnvironmentAware, Ordered{ 。。。 }
在.上面的源代码中 , AutoConfigurationlmportSelector 并没有 直接实现 ImportSelector 接口 , 而是实现了它的子接口 DeferredIlmportSelector 。
DeferredlmportSelector 接口与 ImportSelector 的区别是 , 前者会在所有的@Configuration类加载完成之后再加载返回的配置类 , 而 ImportSelector 是在加载完@Configuration 类之前先去加载返回的配置类 。
推荐阅读
- 集录音转写、拍照翻译为一体,搜狗AI录音笔E2带你开启智慧办公新体验
- 小姐姐带你探索萌粉电竞显示器的秘密
- 华为5G智能摄像机带你看查干湖冬捕
- 解锁年轻人视频社交新方式 华为nova8 Pro带你拍出专业Vlog
- RX 6000玩游戏好在哪?Frank Azor带你细细品
- 惠州惠城供电局:智慧“云”监工守护一线安全防线
- 十二不如十三香,其中的十三又究竟是什么,带你了解十三香
- 华为DIGIX数字生活节即将落地广州 带你一起领略数字生活新风尚
- RX6000玩游戏好在哪?AMD首席游戏架构师Frank Azor带你细细品
- 华为成都旗舰店正式开业 AR熊猫带你进入智慧生活