Spring Boot 自动装配原理

实例化并且调用是在 AbstractApplicationContext 中进行的,最终会在 ConfigurationClassPostProcessor#processConfigBeanDefinitions 调用 ConfigurationClassParser#parse 的方法,最后会调用 doProcessConfigurationClass 对其各种注解进行解析,在处理 @Import 注解的时候会将 @Import 导入的类通过 getImports(sourceClass) 方法直接获得,可以看到 importCandidates 中有四个值,主要的两个为 AutoConfigurationPackages$Register 和 AutoConfigurationImportSelector,

通过类图可以看到 AutoConfigurationImportSelector 实现了 DeferredImportSelector 接口,所以在 processImports 中处理的时候,会使用 DeferredImportSelectorHandler#handle 进行处理,将其添加到 deferredImportSelectors 列表中,

解析完成之后,在 ConfigurationClassParser#parse 方法中 this.deferredImportSelectorHandler.process() 进行处理导入的 AutoConfigurationImportSelector类。使用 DeferredImportSelectorGroupingHandler#processGroupImports() 进行下一步的处理。

grouping.getImports() -> getImports() -> process()。

在 process 方法中会获取所有自动装配的 class 对象,调用的是 AutoConfigurationImportSelector#getAutoConfigurationEntry 的方法,通过getCandidateConfigurations(annotationMetadata, attributes) 获取所有的候选配置类,在其中调用 SpringFactoriesLoader#LoadFactoryNames 方法获取。

AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector)deferredImportSelector).getAutoConfigurationEntry(annotationMetadata);

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {

    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),

getBeanClassLoader());

    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct.");

    return configurations;

}

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {

    ClassLoader classLoaderToUse = classLoader;

    if (classLoaderToUse == null) {

        classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();

    }

    String factoryTypeName = factoryType.getName();

    return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());

}

/** 返回SpringFactoriesLoader用来加载候选配置的类 */

protected Class<?> getSpringFactoriesLoaderFactoryClass() {

    return EnableAutoConfiguration.class;

}

最终通过 loadSpringFactories 获取在 META-INF/spring.factories 中所有的配置。

USB Microphone https://www.soft-voice.com/

Wooden Speakers  https://www.zeshuiplatform.com/

亚马逊测评 www.yisuping.cn

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容