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 默认的自动配置类)

 

posted @ 2021-02-03 16:15  问道有先后  阅读(113)  评论(0)    收藏  举报