天天看點

今天看到有人在問SpringBoot自動裝配原理。

很多人講這個會從@EnableAutoConfiguration注解為入口其實對于初學者來說還是不太容易了解,為什麼有這個注解就會自動裝配了

其實SpringBoot的入口在invokeBeanFactoryPostProcessors(beanFactory);這個方法中,熟悉Spring源碼的應該知道,這個類會加載執行我們的所有BeanFactoryPostProcessor,而這個方法中SpringBoot做了擴充,就是擷取BeanFactory中的所有BeanDefinitionRegistryPostProcessor.class,結果隻有一個就是org.springframework.context.annotation.internalConfigurationAnnotationProcessor,這個類并不是我們的目标類,也很明顯這個類的首個字母為小寫,但是這個類指向的是我們ConfigurationClassPostProcessor,具體為什麼感興趣的可以查一下,我就不展開了,這個類是SpringBoot的核心類,他會掃描SpringBoot啟動器類加載器所能觸及的所有加有@Bean,@Component等,對于自動裝配我們隻關注他會遞歸掃描我們啟動器類上的注解,将所有@Import注解标注的目标類,加入到this.deferredImportSelectors屬性中,然後根據注解的目标類也就是我們的AutoConfigurationImportSelector.class,然後周遊所有的引入的類的getImports()方法,我們隻關注AutoConfigurationImportSelector的,方法中有一個重要的方法getAutoConfigurationEntry(annotationMetadata);進入方法中我們隻需要關注List configurations = getCandidateConfigurations(annotationMetadata, attributes);這一行,進去後發現了我們最熟悉的SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());而第一個參數(getSpringFactoriesLoaderFactoryClass()傳回的就是EnableAutoConfiguration.class;

OK收,此時我們擷取自動裝配類的邏輯已經結束了,對于後續有興趣的可以自己翻幾遍源碼。謝謝大家。