參考原文:https://blog.csdn.net/weixin_38538285/article/details/119979419
一原理:
springboot可以幫助我們快速的開發一個后端應用,我們只需引入依賴,添加簡單的配置就能實現對其他框架的整合。他的奧妙就在於它各種各樣的starter。
springboot是如何實現引入一些jar包的依賴就將這些jar包中定義的spring的bean加載到spring容器中的呢?答案就是spring的SPI機制。
SPI(Service Provider Interface)服務提供接口,是實現服務解耦,插件自由插拔的一種機制。通過一些類加載器,去加載classpath下指定目錄文件,文件中定義的有需要加載的類的全權限定名,然后這些類會被識別並加載。
Spring的SPI使用由SpringFactoriesLoader.loadFactoryNames方法實現。
加載所有依賴的jar包下classPath下META-INF/spring.factories文件,然后將解析properties文件,找到指定名稱的配置后返回。
小知識:
(@Import(Abc.class),如果Abc類實現了ImportSelector接口,spring容器就會實例化Abc類,並且調用其selectImports方法;)
(@Import(Abc.class),如果Abc類實現了ImportBeanDefinitionRegistrar接口,spring容器就會實例化Abc類,並且調用其registerBeanDefinitions方法;)
調用鏈路:@SpringBootApplication ->@EnableAutoConfiguration ->@Import({AutoConfigurationImportSelector.class})
->selectImports ->getAutoConfigurationEntry
->getCandidateConfigurations ->SpringFactoriesLoader.loadFactoryNames ->loadSpringFactories
->classLoader.getResources("META-INF/spring.factories")
