springboot 的自动装配源码执行流程
sptingboot(2.1.9) 启动run方法后, 会在refresh( )方法中调用 beanfactorypostprocessor 接口的方法, 其中自动化配置的处理是由autoconfigurationPostProcessor 类去处理的, 该类通过 ConfigurationClassParser 类处理注解的解析
任务, 最终是由AutoConfigurationImportSelector 和 SpringFactoriesLoder 完成 spring.factories(xxxautoConfiguration.class)的加载, 当完成xxxautoconfiguration.class 的加载后,在refresh( )方法中会进行bean的实例化和初始化(xxxautoconfiguration.class 中的各种属性@bean 标注bean也会在此时完成注册) 在 源码调用流程如下:
SpringApplication.run
--> run()
--> run()
--> refreshContext(context)
--> refresh()
-->(AbstractApplicationContext) refresh()
--> this.invokeBeanFactoryPostProcessors(beanFactory) // 在refresh方法中进行beanfactorypostprocessor 的调用
--> invokeBeanFactoryPostProcessors()
--> invokeBeanDefinitionRegistryPostProcessors()
--> (ConfigurationClassPostProcessor) postProcessor.postProcessBeanDefinitionRegistry(registry) //调用自动配置类处理器去进行 自动配置类的读取, 生成beandefinition 存入 beandefinitionMap中,
--> this.processConfigBeanDefinitions(registry)
--> parser.parse(candidates)
--> deferredImportSelectorHandler.process()
--> processGroupImports()
--> processImports() () // 被递归调用
//当解析到 启动类的的时候, 会导入AutoConfigurationImportSelector.class ( @Import({AutoConfigurationImportSelector.class})) 该类是职责是加载spring.factories, 下面这段代码是通过 AutoConfigurationImportSelector 类加载spring.factories
if (candidate.isAssignable(ImportSelector.class)) { candidateClass = candidate.loadClass(); ImportSelector selector = (ImportSelector)BeanUtils.instantiateClass(candidateClass, ImportSelector.class); ParserStrategyUtils.invokeAwareMethods(selector, this.environment, this.resourceLoader, this.registry); if (selector instanceof DeferredImportSelector) {
//走该分支 该selector 就是AutoConfigurationImportSelector this.deferredImportSelectorHandler.handle(configClass, (DeferredImportSelector)selector); } else { String[] importClassNames = selector.selectImports(currentSourceClass.getMetadata()); Collection<ConfigurationClassParser.SourceClass> importSourceClasses = this.asSourceClasses(importClassNames); this.processImports(configClass, currentSourceClass, importSourceClasses, false); } }
--> this.deferredImportSelectorHandler.handle()
--> handler.processGroupImports()
--> grouping.getImports()
--> (AutoConfigurationImportSelector) process()
--> getAutoConfigurationEntry()
--> SpringFactoriesLoader.loadFactoryNames() (得到springboot 默认的自动配置类)

浙公网安备 33010602011771号