SpringFactoriesLoader原理解析

前言

SpringFactoriesLoader工厂加载机制是Spring内部提供的一个约定俗成的加载方式,与java spi类似,只需要在模块的META-INF/spring.factories文件,这个Properties格式的文件中的key是接口、注解、或抽象类的全名,value是以逗号 “ , “ 分隔的实现类,使用SpringFactoriesLoader来实现相应的实现类注入Spirng容器中。

下面以SpirngBoot的自动配置@EnableAutoConfiguration(springboot 1.5.x版本)的实现来讲解SpringFactoriesLoader。


SpringFactoriesLoader原理解析_第1张图片

可以知道,该配置已经是满足了SpringFactoriesLoader的要求,下面我们来看看是如何来触发其找到相应的类并加载的。


SpringFactoriesLoader原理解析_第2张图片

可以看到在SpringBootApplication中有@EnableAutoConfiguration注解;


SpringFactoriesLoader原理解析_第3张图片

可以看到该注解,@Import(EnableAutoConfigurationImportSelector.class)该注解会将EnableAutoConfigurationImportSelector实例化并注入容器中。

其中,ConfigurationClassParser这个类的processImports方法会对ImportSelector中的selectImports进行调用

SpringFactoriesLoader原理解析_第4张图片

对其进行调试发现其使用的是AppClassLoader

SpringFactoriesLoader原理解析_第5张图片

该句代码为核心:

List configurations = getCandidateConfigurations(annotationMetadata,attributes);

SpringFactoriesLoader原理解析_第6张图片

可知,这里终于调用了SpringFactoriesLoader的方法:

List configurations =SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

getSpringFactoriesLoaderFactoryClass()返回的是EnableAutoConfiguration.class;

getBeanClassLoader()这里使用的是AppClassLoader。


SpringFactoriesLoader原理解析_第7张图片

这里FACTORIES_RESOURCE_LOCATION ="META-INF/spring.factories";

可知,这个在便利所用的jar包下的META-INF/spring.factories文件,并对相应的key值进行筛选,这里使用的key值为org.springframework.boot.autoconfigure.EnableAutoConfiguration。

这样,我们就能得到对应的一组@Configuration类,我们就可以通过反射实例化这些类然后注入到IOC容器中,最后容器里就有了一系列标注了@Configuration的JavaConfig形式的配置类。

例如Tomcat容器的加载,在本文开头的spring.factories配置文件中,在key为EnableAutoConfiguration中有如下配置类,org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration


SpringFactoriesLoader原理解析_第8张图片

可以看到该配置类中是对springboot中支持三种web容器,关于载入哪种是根据其是否依赖了相应的容器实现类(@ConditionalOnClass控制实现)。

在springboot中默认是使用Tomcat做为web容器(springboot1.5.x),因为

SpringFactoriesLoader原理解析_第9张图片

该依赖默认会导入Tomcat的jar包。


SpringFactoriesLoader原理解析_第10张图片


在springboot中开发了大量的spring-boot-starter的组件,组件中依赖了相应的实现包。


SpringFactoriesLoader原理解析_第11张图片

总结

使用SpringFactoriesLoader寻找jar包配置META-INF下的spring.fatories配置文件相应key的value类,然后通过spring的@Configuration对相应的bean进行有选择(@ConditionalOnClass)的实例化。

你可能感兴趣的:(SpringFactoriesLoader原理解析)