参考原文: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")